Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

collection_check_boxes undefined method `id' for {:id=>1,...} in Hash

I'm using simple_form and collection_check_boxes in this form:

<%= 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 %>

I get the error:

undefined method 'id' for {:id=>1, :name=>"chris"}:Hash

Using a collection like User.all works fine, i.e.:

<%= f.collection_check_boxes :required_fields, User.all, :id, :name, checked: User.all.map(&:id) do |b| %>

Why can't I use a hash here?

like image 693
DogEatDog Avatar asked Nov 01 '25 08:11

DogEatDog


1 Answers

A hash requires you to access the :id key using hash[:id]. Rails generate getter methods for all columns in an ActiveRecord class as a default, meaning you can call, for example, user.id.

You can use an OpenStruct to achieve this:

x = OpenStruct.new(:id: 1, name: 'chris')
x.id #=> 1

In your case:

<%= f.collection_check_boxes :required_fields, [OpenStruct.new(:id: 1, name: 'chris'), OpenStruct.new(:id: 2, name: 'damn')], :id, :name #.....

Hope that helps - let me know if you've any questions.

like image 85
SRack Avatar answered Nov 03 '25 00:11

SRack



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!