2011-01-22 22 views
0

用戶擁有多個網站,並且網站上有許多關鍵字。 (關鍵詞是網站資源的嵌套資源)如何爲文本區域中的每一行驗證並創建新模型

現在,使用默認腳手架設置,一次添加多個關鍵字非常繁瑣。我想要一個文本區域而不是文本區域,該區域允許用戶輸入多個關鍵字,每個關鍵字都是自己的,並一次提交。表單中唯一的輸入是關鍵字的「文本」列。

我該怎麼做?

我可以找出像params[:keyword][:text].split("\r\n").each do |text|這樣的東西,但我不確定如何與Rails窗體進行交互。

<%= form_for [@website, @keyword] do |f| %> 
    <% if @keyword.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@keyword.errors.count, "error") %> prohibited this keyword from being saved:</h2> 

     <ul> 
     <% @keyword.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :text %><br /> 
    <%= f.text_area :text %> 
    </div> 

    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

回答

0

(注:我本來卡住這對原來的崗位作爲編輯,所以我直接複製並粘貼它,所以它是最好的答案)

這裏是我結束了在同時做。這是馬虎(我是一個紅寶石noob),但它保存有效的關鍵字,並呈現回失敗的關鍵字列表「新」:

# keywords_controller 
def create 
    invalid_keywords = [] 
    valid_keywords = [] 
    params[:keyword][:text].split("\r\n").map(&:strip).delete_if {|text| text == ""}.each do |text| 
     keyword = @website.keywords.new(:text => text.downcase) 
     if keyword.save 
     valid_keywords << keyword 
     else 
     invalid_keywords << keyword 
     end 
    end 

    if invalid_keywords.empty? # All keywords saved 
     redirect_to @website, :notice => "Keyword(s) added" 
    else # These keywords didn't save 
     @keyword = @website.keywords.new(:text => invalid_keywords.map(&:text).join("\r\n")) 
     @errors = invalid_keywords.first.errors 
     flash[:success] = "#{valid_keywords.count} keywords were saved" 
     flash[:alert] = "#{invalid_keywords.count} keywords did not save (shown below)" 
     render :action => "new" 
    end 
end 
1

您是否考慮解析由逗號分隔的關鍵字(如果關鍵字是單個單詞,甚至是spaces)?我認爲這是更常見的...至少在我的經驗。

對於逗號,它將如此簡單:line.split(',')

而逗號後面&之前刪除空格:line.split(/\s*,\s*/)line.split(',').map{|k| k.strip}