#ruby-on-rails #ruby-on-rails-3
#ruby-on-rails #ruby-on-rails-3
Вопрос:
У меня есть фрагмент кода, который выглядит следующим образом;
<% @current_user.prices.each_with_index do | t, i| %>
<tr>
<td> <%= (i 1) %> </td>
<td> <%= t.country %> </td>
<td> <%= t.network %> </td>
<td> <%= t.send("price_#{@current_user.currency.downcase}") %> </td>
</tr>
<% end %>
но это выдает ошибку;
ActionView::Template::Error (undefined method `currency' for nil:NilClass):
30: <td> <%= (i 1) %> </td>
31: <td> <%= t.country %> </td>
32: <td> <%= t.network %> </td>
33: <td> <%= t.send("price_#{@current_user.currency.downcase}") %> </td>
34: </tr>
35: <% end %>
36: <% else %>
app/views/prices/index.html.erb:33:in `block in _app_views_prices_index_html_erb__1511544251155426207_16153880'
app/views/prices/index.html.erb:28:in `_app_views_prices_index_html_erb__1511544251155426207_16153880'
Однако в очень похожих обстоятельствах это работает просто отлично;
<% @current_user.prices.each_with_index do | t, i| %>
<tr>
<td> <%= (i 1) %> </td>
<td> <%= t.country %> </td>
<td> <%= t.network %> </td>
<td> <%= t.send("price_#{@current_user.currency.downcase}") %> </td>
</tr>
Почему это работает в одном сценарии, а не в другом? Может быть, я просто устал в любом случае.
Комментарии:
1. у вас есть два совершенно идентичных фрагмента кода вверху и внизу вашего вопроса. в чем причина этого?
2. Ваш
@current_user
былnil
в таких обстоятельствах. Скорее всего, вы забыли назначить его в контроллере. И да, я не вижу различий только между ними, но забыл<% end %>
, что это должно закончиться синтаксической ошибкой.3. Если @current_user равен нулю при
.currency
вызове на нем, это немного странно, потому что он был бы равен нулю при.prices
вызове на нем. Вы уверены, что скопировали и вставили свой код? Если вы ввели его здесь, возможно, вы не повторили опечатку / ошибку в своем коде. В качестве альтернативы, что-то может быть сбросом @current_user (до нуля) в другом методе, который вызывает ваше создание.
Ответ №1:
для одного пользователя он имеет некоторое значение, отличное от nil, а для текущего пользователя значение currency равно нулю. причину возникновения этой ошибки вы можете проверить с помощью консоли или применить точку останова и проверить текущее значение валюты пользователя
Ответ №2:
Похоже, что ваша @current_user
переменная равна нулю, и вы вызываете currency для этого нулевого объекта.
РЕШЕНИЕ
Если вы просто хотите пропустить эту ошибку, вы можете использовать try()
приведенный ниже код.
Пример:
@current_user.try(:currency).try(:downcase)
# try() behaves something like ternary operator (if then else)
Но я предлагаю вам присвоить @current_user
требуемое значение. Потому что, если вы будете использовать try()
, он вернет nil, если родительский объект равен nil . Итак, отладьте свою @current_user
переменную и присвоите ей правильное значение.
Ответ №3:
@current_user.currency.downcase
не сработало, потому index controller
что не аутентифицировано с помощью devise и, следовательно @current_user
, не определено.
Однако я не могу объяснить, почему он был определен несколькими строками выше этой строки.