2015-01-13 12 views
11

around_actionについて私はひどく混乱しています。どのように機能するのですか?誰かが私に彼らの働き方の例/説明を教えてくれますか?around_actionコールバックはどのように機能しますか?説明が必要です

これは私のアジャイルWeb開発の4本からの引用です:アクションの実行をラップアラウンドコールバック

。コールバックの周りに を2つの異なるスタイルで書くことができます。最初のコードでは、コールバックは です。そのコードは、アクションが実行される前に呼び出されます。コールバックコードがyieldを呼び出すと、アクションが実行されます。アクションが完了すると、コールバックコードは実行を継続します。したがって、yieldの前のコードはbeforeアクションのコールバックのようになり、yieldの後のコードはafterアクションのコールバックになります。コールバックコードがyieldを呼び出さない場合アクションは実行されません。これは、前のアクションコールバックにfalseを返すことと同じです。

これを読んだときに私は一種を取得します。以下はRailsガイドの例です

class ChangesController < ApplicationController 
    around_action :wrap_in_transaction, only: :show 

    private 

    def wrap_in_transaction 
    ActiveRecord::Base.transaction do 
     begin 
     yield 
     ensure 
     raise ActiveRecord::Rollback 
     end 
    end 
    end 
end 

ここで何が起こっていますか? ActiveRecord :: Base.transactionは "before"パートとして始まり、 "after"パートとしてActiveRecord :: Rollbackを送出しますか?この方法には何がありますか?それはショーですか?最後に、yieldメソッドが失敗してコールバック全体が失敗する原因は何ですか?ショーアクションのレンダリングですか?理解できません。助けてください。

答えて

10

私の理解では、以下の通りです:

begin 
    # Do before action... 
    logger.info 'I am the before action' 

    # Do the action, which is passed as a block to your "around filter" 
    # Note that if you were to delete this line, the action will never be called! 
    yield 

    # Do after action... 
    logger.info 'I am the after action' 
ensure 
    raise ActiveRecord::Rollback 
end 
10

around_callbackのキーはyieldです。 wrap_in_transactionの例の場合、収率はshowのアクションに置き換えられます。 showが終了すると(レンダリングを含む)、wrap_in_transactionはロールバックを継続して行います。あなたは見つけることができますguidesレールで

:変更が承認を持っているウェブサイトでは、例えば

は、管理者だけで、簡単にそれらをプレビューするトランザクション内でそれらを適用することができる可能性がありワークフロー:...注意を周囲のフィルタもレンダリングされます。それ自体がスコープまたは何を介してデータベースから読み出しビュー上記の例の場合は特に、それはトランザクション内でそうになり、従って、プレビューにデータを提示する。」show缶にユーザを意味

をロールバック前の情報を参照してください(この場合はshowは情報アクションであるためロールバックが必要なソート・アップデートを実行する必要があります)。

before_callbackはbeforeコールバックとafterコールバックです1つの方法、yieldを使用してアクションを中央に配置します。

関連する問題