collection_check_boxes неопределенный метод `id 'для {: id => 1, ...} в хэше - PullRequest
0 голосов
/ 05 июня 2018

Я использую 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| %>

Почему я не могу использовать хеш здесь?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Когда вы используете этот синтаксис User.all.map(&:id), вы делаете то же самое, что и User.all.map { |u| u.id }, и он работает, потому что id является атрибутом пользователя.

В случае рубина Hash,вам нужно сопоставить по ключу, вы не можете вызвать любой атрибут AR:

[{ :id => 1, :name => 'chris'}, { :id => 2, :name => 'damn'}].map { |u| u[:id] }
0 голосов
/ 05 июня 2018

Хэш требует, чтобы вы получили доступ к клавише :id, используя hash[:id].Rails генерирует методы получения для всех столбцов в классе ActiveRecord по умолчанию, что означает, что вы можете вызвать, например, 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 #.....

Надеюсь, это поможет - дайте мне знать, если у вас есть какие-либо вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...