2013-12-17 11 views
18

私は、「Agile Web Development with Rails 4」のページを読んでいます。 338と書いてあります。Rails 4でbefore_actionがfalseを返すのは何ですか?

[...]コールバックは、コントローラによって実行される受動的な監視アクティビティです。また、要求処理においてより積極的な役割を果たすこともできます。 beforeアクションコールバックがfalseを返した場合、コールバックチェーンの処理は終了し、アクションは実行されません。 [...]

は今、私の疑問は以下の通りである。ここではhow to execute an action if the before_action returns falseそれはbefore_actionの目標は、アクションが実行される前に、それがいることを意味するものではありませんfalseを返した場合、何かを準備することであると言われましたアクションは実行されていませんが、本によればそれは正しいので...私はちょっと混乱しています。以前before_filterという名前

私は、次の

class ProductsController < ApplicationController 
before_action :test 

    def index 
    @products = Product.all 
    end 


    private 

    def test 
     return false 
    end 
end 

をしようとしている場合でも、アクションが実行され、私は/productsを呼び出すときに、私はすべてのエラーを取得しないとページが

+0

私はあまりにも長く、tl; dr; 'hello'が実行されなかった場合、戻り値は無関係です – akostadinov

答えて

36

before_actionうまくアップ示し( )は、アクションが実行される前に実行されるコールバックです。 controller before/after_actionについて詳しく読むことができます。

通常、アクションの準備や実行の変更に使用されます。

チェーン内のメソッドのいずれかがレンダリングまたはリダイレクトされた場合、実行は中止され、アクションはレンダリングされません。この例では

before_action :check_permission 

def hello 
end 

protected 

def check_permission 
    unless current_user.admin? 
    # head is equivalent to a rendering 
    head(403) 
    end 
end 

current_user.admin? falseを返す場合、helloアクションが実行されることはありません。

次一つは、代わりに、アクションの設定の例です。この場合は

before_action :find_post 

def show 
    # ... 
end 

def edit 
    # ... 
end 

def update 
    # ... 
end 

protected 

def find_post 
    @post = Post.find(params[:id]) 
end 

find_postはfalseを返すことはありません。実際、このbefore_actionの目的は、アクションの本体から共有コマンドを抽出することです。

返信についてfalse私が知る限り、これはActiveRecordコールバックに当てはまります。しかし、before_actionの場合、falseを返すことは効果がありません。実際、戻り値は公式文書では重要ではないと言われています。

+1

何が実行されますか? – zer0uno

+0

この例をより明示的に更新しました。この場合、要求は403. –

+0

を返す私の質問を更新しました – zer0uno

関連する問題