2013-11-21 2 views
11

Я знаю, что с помощью следующего кода:как выполнить действие, если before_action возвращает ложь

before_action :signed_in?, only: [:new]

действие new будет выполняться, если signed_in? возвращает истину, но вместо этого, если я хочу new действие для выполнения, когда signed_in? возвращает false, что мне делать? Нужно ли мне создавать новый метод, например, not_signed_in??

Вот это мой signed_in? метод

def signed_in? 
    [email protected]_user.nil? 
end 
+0

Вы уверены, что это не будет работать, если 'signed_in?' возвращает 'false'? Зачем это делать? –

+0

Какова цель 'before_action'? Блокировать выполнение действия, если оно возвращает false? – zer0uno

+0

№ Назначение: подготовить что-то до выполнения вашего метода. –

ответ

15

before_action не работает, как вы думаете, - это не мешает действие, которое будет выполняться, если обратный вызов возвращает false. я бы решить вашу проблему немного другим способом, например:

before_action :redirect_to_root, :if => :signed_in?, :only => :new 

# ... 
private 
def redirect_to_root 
    redirect_to root_path 
end 
+0

Да, вы правы. Спасибо p.s. pozdrawiaj jakub jalbzykowski ode mnie! ;) – zer0uno

+0

@antox LOL Откуда вы знаете Jakub? И откуда ты знаешь, что я его знаю? :) Facebook? : P –

+0

FB знает все! :) Откуда я знаю его? uuu это долгая история, может быть, он мог бы рассказать вам – zer0uno

7
before_action :new, unless: -> { signed_in? } 

alltough я думаю, его лучше перенаправить в акции, которая была вызвана.

def your_action_called 
    redirect_to :new unless signed_in? 
    [...code ...] 
end 
+0

вышеуказанный способ лямбда не работает – ahnbizcad

0

Если вы хотите, чтобы охватить все другие методы с
before_action :signed_in?
кроме нового действия, you'b лучше использовать :except вместо :only
например:
before_action :signed_in?, except: :new