2016-09-10 6 views
6

私はDeviseコードを調べて、ほとんどのコントローラーがリソースを生成することに気づいた。Deviseコントローラの「yield resource」は何をしますか?

class Devise::RegistrationsController < DeviseController 
    # ... 
    def create 
    build_resource(sign_up_params) 

    resource.save 
    yield resource if block_given? 
    # ... 

これはある種の拡張機能でなければなりませんが、実際にブロックをコントローラアクションに渡す方法はわかりません。

注:この質問は、Rubyのブロックの仕組みではなく、実際にRailsのリクエストサイクルでどのように行うのかについてです。

+0

http://mudge.name/2011/01/26/passing-blocks-in-ruby-without-block.html – Jonathan

+0

@ジョナサン右のようなものがあるかもしれません。例えば

が、最初の場所で 'Devise :: RegistrationsController#create'にブロックを渡す方法はまだ説明していません。 AFAIKこれはルータによって呼び出されます。 – max

+0

私が間違っていない場合、Rubyのどのメソッドにもブロックを渡すことができます。やってみなよ。限り、それは最後の引数である – Jonathan

答えて

14

サブクラスが、deviseによって提供されたcreateの実装を再利用できるようにするが、プロセスにフックできる。あなたは

class MyRegistrations < Devise::RegistrationsController 
    def create 
    super { |resource| ... } 
    end 
end 
+0

それはなぜ 'yield resource if block_given? 'と書かれているのかを説明しています。変数が渡された場合にのみ呼び出します。 –

+0

はい@FabrizioBertoglio。それ以外の場合は、ローカルジャンプエラーが発生します。 – max

+0

@maxありがとうございました! –

関連する問題