我以这种形式使用simple_form
和collection_check_boxes
:
<%= simple_form_for(@geo_path_media_type) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :name %>
<%= f.input :category %>
<%= f.collection_check_boxes :required_fields, [{ :id => 1, :name => 'chris'}, { :id => 2, :name => 'damn'}], :id, :name, checked: [{ :id => 1, :name => 'chris'}, { :id => 2, :name => 'damn'}].map(&:id) do |b| %>
<span>
<%= b.check_box %>
<%= b.label %>
</span>
<% end %>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>
我收到错误:
undefined method 'id' for {:id=>1, :name=>"chris"}:Hash
使用像User.all
之类的集合可以正常工作,即:
<%= f.collection_check_boxes :required_fields, User.all, :id, :name, checked: User.all.map(&:id) do |b| %>
为什么我不能在这里使用哈希?
答案 0 :(得分:2)
哈希要求您使用:id
访问hash[:id]
密钥。 Rails为ActiveRecord类中的所有列生成getter方法作为默认值,这意味着您可以调用,例如user.id
。
您可以使用OpenStruct
来实现此目的:
x = OpenStruct.new(:id: 1, name: 'chris')
x.id #=> 1
在你的情况下:
<%= f.collection_check_boxes :required_fields, [OpenStruct.new(:id: 1, name: 'chris'), OpenStruct.new(:id: 2, name: 'damn')], :id, :name #.....
希望有所帮助 - 如果您有任何疑问,请与我联系。
答案 1 :(得分:1)
当您使用此语法User.all.map(&:id)
时,您与User.all.map { |u| u.id }
执行相同操作,因为id
是User的属性,所以它有效。
如果是红宝石Hash
,您需要按键映射,不能调用任何AR属性:
[{ :id => 1, :name => 'chris'}, { :id => 2, :name => 'damn'}].map { |u| u[:id] }