Подтвердить что ты не робот

Как выполнить действие, если 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
4b9b3361

Ответ 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