#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 .