Rails: показывать только указанные c объекты внутри поля выбора формы - PullRequest
1 голос
/ 14 января 2020

У меня есть форма, которую я создаю токены для пользователей. Сначала я нахожу всех пользователей @users = User.order('name ASC') внутри контроллера. Затем внутри формы создания токена у меня есть поле выбора, из которого я пытаюсь показать только пользователей, у которых нет токена:

<% @users.each do |user| %>
  <% if user.token.blank? %>
    <%= f.input :user_id, collection: user, label: "Associate with", value_method: :id, :include_blank => "Select a user"  %>
   <% end %>
 <% end %>

Но по какой-то причине я получаю эту ошибку:

undefined method `to_a' for #<User:0x00007f95a54086b0>
Did you mean?  to_s

Есть идеи, как мне это исправить?

Ответы [ 2 ]

1 голос
/ 14 января 2020

UPDATE. Просто чтобы уточнить вещи. Вы получаете эту ошибку, потому что вы передаете один единственный пользователь в качестве коллекции на вход. И, ожидая сбора, он попытается преобразовать все, что вы передали в массив. Но он не сможет правильно преобразовать одного пользователя в массив. Таким образом, вы должны были передать коллекцию пользователей. Например:

<%= f.input :user_id, collection: @users, label: "Associate with", value_method: :id, :include_blank => "Select a user"  %>

Конечно, для этого вам нужно, чтобы пользователи без токенов уже были назначены для вашей переменной @users.

Или, как я понимаю вашу проблему, я могу предложить альтернативу:

Таким образом, предполагая, что у пользователей без токена для столбца token установлено значение nil, вы можете сделать что-то вроде этого:

<%= f.select :users, options_for_select(@users.where(token: nil).pluck(:name, :id)), include_blank: true %>

Это избавит вас от необходимости явной итерации @users явно и создать вход для каждого из них, т.е. приведенный выше код должен полностью заменить это

<% @users.each do |user| %>
  <% if user.token.blank? %>
    <%= f.input :user_id, collection: user, label: "Associate with", value_method: :id, :include_blank => "Select a user"  %>
  <% end %>
<% end %>

Конечно, не стесняйтесь настраивать этого помощника select так, как вам нужно.

Если вы это сделаете не нужно @users с токенами где-либо в текущем действии или форме контроллера, вам следует рассмотреть возможность назначения @users = User.where(token: nil) прямо в действии вашего контроллера.

0 голосов
/ 14 января 2020

@ пользователи должны уже содержать пользователей, у которых нет токена для этого:

<%= f.input :user_id, collection: @users, label: "Associate with", value_method: :id, :include_blank => "Select a user"  %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...