У меня есть этот код в представлении User#index
:
<%= User.find_each do |user| %>
<%= user.name %>
<% end %>
который возвращает имена пользователей:
user1 user2 user3 ...
Затем я перемещаю этот код в UserHelper
:
module UserHelper
def get_users
User.find_each do |user|
user.name
end
end
end
И вызовите его из представления User#index
с помощью:
<%= get_users %>
Проблема в том, что это не возвращает ни одного пользователя. Если я использую <%= get_users.class %>
, он выводит NilClass
. Почему вспомогательный метод не возвращает имена пользователей?
Ваш вспомогательный метод неявно возвращает результат вызова find_each
, который отличается от возврата коллекции имен пользователей.
Думайте об этом как о беге 5.times { |n| puts n }
: какая в этом ценность? Не «0 1 2 3 4», а «5», потому что times
возвращает то, что было вызвано, а не то, что выполняется в его блоке.
Между прочим, ваш исходный код возвращает то же самое — вы полагаетесь на побочный эффект внутри блока find_each
, то есть добавляете user.name
к ответу.
Если вы хотите вернуть коллекцию имен пользователей, вам нужно map
/etc. и захватить имя каждого пользователя. Или, IIRC, вы можете выполнить поиск и удаление, чтобы вернуть только имена пользователей, а не все пользовательские поля.
Вы также можете использовать, как показано ниже,
<%= User.all.map(&:name).join(' ') %>
использование
map
решило проблему. Я изменил помощника на:User.find_each.map { |u| u.name }
и вид на:<%= get_users.join(' ') %>
.