如何为文本区域中的每一行验证和创建新模型

时间:2011-01-22 22:54:47

标签: ruby-on-rails forms nested-forms

用户拥有许多网站,网站有很多关键字。 (关键字是网站资源的嵌套资源)

目前,使用默认的脚手架设置,一次添加多个关键字非常繁琐。我想要一个文本区域而不是文本字段,允许用户在自己的行上键入许多关键字,并一次性提交所有关键字。表单上的唯一输入是关键字的“文本”列。

我该怎么做?

我可以找出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 %>

4 个答案:

答案 0 :(得分:1)

您是否考虑过分析以逗号分隔的关键字(如果您的关键字是单个'字词',则甚至是spaces)?我认为这更常见......至少在我的经验中。

对于逗号,它就像:line.split(',')一样简单。

在&amp;之前删除空格逗号后:line.split(/\s*,\s*/) line.split(',').map{|k| k.strip}

答案 1 :(得分:0)

网站可能有很多关键字。

我建议您查看:http://railscasts.com/episodes/197-nested-model-form-part-2

答案 2 :(得分:0)

如果您希望关键字使用类似用户界面的标记,请使用jQuery Tag it!的输入然后您可以使用某个模型callbacks解析它以适合has_many关系或使用full tags like solution

答案 3 :(得分:0)

(注意:我最初将其作为编辑粘贴在原始帖子上,所以我反而将其复制并粘贴,因此这是最好的答案)

这是我最后做的事情。它很草率(我是一个Ruby 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