ActionView::Template::Ошибка (неопределенный метод `currency’ для nil:NilClass):

#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 , не определено.

Однако я не могу объяснить, почему он был определен несколькими строками выше этой строки.