неопределенный метод `id’ для false: FalseClass

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Ошибка ( undefined method 'id' for false:FalseClass ) ссылается на эту строку:

 if current_user amp;amp; current_user.admin? || current_user.id == id.to_i
 

Почему это приводит к ошибке? Разве он не должен быть достигнут current_user.id , если первое amp;amp; условие не выполняется?

Ответ №1:

Выражение

 current_user amp;amp; current_user.admin? || current_user.id == id.to_i
 

Анализируется следующим образом

 (current_user amp;amp; current_user.admin?) || (current_user.id == id.to_i)
 

Итак, когда current_user имеет значение false, оценка выполняется примерно так

 (false amp;amp; current_user.admin?) || ?
(false)                        || ?
                                  (false.id == id.to_i)
                               # \ KABOOM! //
 

Вероятно, это должно быть выражено следующим образом, со скобками, в которых методы вызываются только для current_user, если это не false / nil .

 current_user amp;amp; (current_user.admin? || current_user.id == id.to_i)
 

В качестве альтернативы, рассмотрите возможность использования других структур управления потоком, таких как if и / или дискретные методы, инкапсулирующие логику.


Также странно, что current_user может быть false : nil вероятно, будет более подходящим, когда «текущего пользователя нет»..

Комментарии:

1. Вы должны предложить в своем ответе правильный способ сделать это, т.Е. A amp;amp; (B || C)

2. @p11y Спасибо за предложение, я добавил это.

3. Спасибо за помощь! Я использую колдовство, поэтому я не писал current_user .

4. 1 к предложению, которое current_user не должно возвращать nil и не false .