Как выполнить действие, если before_action возвращает false
Я знаю, что со следующим кодом:
before_action :signed_in?, only: [:new]
действие new
будет выполнено, если signed_in?
возвращает true, но вместо этого, если я хочу, чтобы действие new
выполнялось, когда signed_in?
возвращает false, что мне нужно делать? Должен ли я создать новый метод, называемый, например, not_signed_in?
?
Вот мой метод signed_in?
def signed_in?
[email protected]_user.nil?
end
Ответы
Ответ 1
before_action не работает, как вы думаете - это не предотвращает выполнение действия, если обратный вызов возвращает false
.
Я бы решил вашу проблему немного по-другому, например:
before_action :redirect_to_root, :if => :signed_in?, :only => :new
# ...
private
def redirect_to_root
redirect_to root_path
end
Ответ 2
before_action :new, unless: -> { signed_in? }
alltough, я думаю, что лучше перенаправить действие, которое было вызвано.
def your_action_called
redirect_to :new unless signed_in?
[...code ...]
end
Ответ 3
Если вы хотите охватить все другие методы с помощью before_action :signed_in?
кроме нового действия, лучше использовать :except
вместо :only
вот так:
before_action :signed_in?, except: :new