假设我有一个Car模型,我希望在其中显示不同类型的数据。我在表格中添加了data
列:
class AddDataToCars < ActiveRecord::Migration[5.0]
def change
add_column :cars, :data, :jsonb, null: false, default: '{}'
add_index :cars, :data, using: :gin
end
end
然后我为我想要出席的字段添加一个访问者(extra_options
):
class Car < ApplicationRecord
store_accessor :data, :wheel_count, :extra_options
validates :extra_options, presence: true
end
我确保它是cars_controller.rb
中的允许参数:
def car_params
params.require(:car).permit(:make, :model, :data, :wheel_count, :extra_options)
end
现在,我可以在_form.html.erb
部分中创建一个文本输入,将数据放入wheel_count
,如下所示:
<div class="field">
<%= f.label :wheel_count %>
<%= f.text_field :wheel_count %>
</div>
它按预期工作。我当时想要的是一个选择列表(多选)或一组复选框,其中所选选项存储在extra_options
下。
我试过了:
<%= f.select :extra_options, options_for_select(["1", "2", "3", "4", "5"], car.extra_options), { include_blank: true }, { multiple: true } %>
产生以下标记:
<input name="car[extra_options][]" type="hidden" value="" />
<select multiple="multiple" name="car[extra_options][]" id="car_extra_options">
<option value=""></option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
显然,选项标签应该比仅仅1,2,3,4和5更有意义,但更糟糕的是,当我提交表单时没有任何内容存储。
在提交时,如果我选择2和3,则参数如下:
"extra_options"=>["", "2", "3"]
导致消息Unpermitted parameter: extra_options
,因此我似乎不允许在此字段中放置数组。
为一些额外的选项创建一个jsonb字段似乎很愚蠢,但它自然也会保存各种其他数据。
那么如何创建一个多选列表,或者最好是一组在jsonb字段中正确保存数据的复选框(当然,当编辑提交时显示已经选中/选中的项目)?
答案 0 :(得分:2)
在car_params中试试这个
params.require(:car).permit(:make, :model, :data, :wheel_count, extra_options: [])
对于复选框,请尝试此
<%= hidden_field_tag "car[extra_options][]", [] %>
<% ["1", "2", "3", "4", "5"].each do |o| %>
<% default_checked = car.extra_options.include?(o.to_s) rescue false %>
<label class="rightpad">
<%= check_box_tag "car[extra_options][]", o, default_checked %>
</label>
<span>
<%= o %>
</span>
<% end %>