Ruby on Rails:在表单中提交一个数组

我有一个模型,有一个属性是一个数组。 什么是我从表单提交填充该属性的正确方法?

我知道有一个表单input与名称包括括号的字段从input创build一个哈希。 我应该只是采取这一点,并在控制器中通过它按摩到arrays?

示例使其不那么抽象:

class Article serialize :links, Array end 

linksvariables采用URL数组的forms,即[["http://www.google.com"], ["http://stackoverflow.com"]]

当我在表单中使用类似下面的内容时,会创build一个哈希值:

 <%= hidden_field_tag "article[links][#{url}]", :track, :value => nil %> 

结果哈希看起来像这样:

 "links" => {"http://www.google.com" => "", "http://stackoverflow.com" => ""} 

如果我不在链接的名称中包含url,则其他值会互相打开:

 <%= hidden_field_tag "article[links]", :track, :value => url %> 

结果如下所示: "links" => "http://stackoverflow.com"

如果你的html表单有空方括号的input字段,那么它们将被转换为控制器中params内的数组。

 # Eg multiple input fields all with the same name: <input type="textbox" name="course[track_codes][]" ...> # will become the Array params["course"]["track_codes"] # with an element for each of the input fields with the same name 

添加:

请注意,轨辅助器没有设置自动神奇地做arrays技巧。 所以你可能必须手动创build名称属性。 此外,checkbox有自己的问题,如果使用rails助手,因为checkbox助手创build额外的隐藏字段来处理未选中的情况。

 = simple_form_for @article do |f| = f.input_field :name, multiple: true = f.input_field :name, multiple: true = f.submit 

TL; HTML版本的HTML []约定:

阵:

 <input type="textbox" name="course[track_codes][]", value="a"> <input type="textbox" name="course[track_codes][]", value="b"> <input type="textbox" name="course[track_codes][]", value="c"> 

收到的参数:

 { course: { track_codes: ['a', 'b', 'c'] } } 

哈希

 <input type="textbox" name="course[track_codes][x]", value="a"> <input type="textbox" name="course[track_codes][y]", value="b"> <input type="textbox" name="course[track_codes][z]", value="c"> 

收到的参数:

 { course: { track_codes: { x: 'a', y: 'b', z: 'c' } } 

我也发现,如果像这样传递你的input帮助器,你将得到一系列具有自己属性的课程。

 # Eg multiple input fields all with the same name: <input type="textbox" name="course[][track_codes]" ...> # will become the Array params["course"] # where you can get the values of all your attributes like this: params["course"].each do |course| course["track_codes"] end 

我只是使用jQuery的taginputbuild立一个解决scheme:

http://xoxco.com/projects/code/tagsinput/

我写了一个自定义的simple_form扩展

 # for use with: http://xoxco.com/projects/code/tagsinput/ class TagInput < SimpleForm::Inputs::Base def input @builder.text_field(attribute_name, input_html_options.merge(value: object.value.join(','))) end end 

一个coffeescrpt片段:

 $('input.tag').tagsInput() 

而对我的控制器的调整,可悲的是要稍微具体一点:

 @user = User.find(params[:id]) attrs = params[:user] if @user.some_field.is_a? Array attrs[:some_field] = attrs[:some_field].split(',') end 

对于那些使用简单的表单,你可以考虑这个解决scheme。 基本上需要设置你自己的input,并使用它:数组。 那么你需要处理你的控制器级别的input。

 #inside lib/utitilies class ArrayInput < SimpleForm::Inputs::Base def input @builder.text_field(attribute_name, input_html_options.merge!({value: object.premium_keyword.join(',')})) end end #inside view/_form ... = f.input :premium_keyword, as: :array, label: 'Premium Keyword (case insensitive, comma seperated)' #inside controller def update pkw = params[:restaurant][:premium_keyword] if pkw.present? pkw = pkw.split(", ") params[:restaurant][:premium_keyword] = pkw end if @restaurant.update_attributes(params[:restaurant]) redirect_to admin_city_restaurants_path, flash: { success: "You have successfully edited a restaurant"} else render :edit end end 

在你的情况只是改变:premium_keyword到你的数组字段