collection_check_boxes未定义方法`id'哈希中的{:id => 1,...}

时间:2018-06-05 14:39:08

标签: ruby-on-rails

我以这种形式使用simple_formcollection_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| %>

为什么我不能在这里使用哈希?

2 个答案:

答案 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] }