カテゴリー:
Rails
タグ:
 Rails devise

このエントリーをはてなブックマークに追加
更新日時:
2012年12月14日(金)
作成日時:
2012年12月14日(金)

前の記事 / 次の記事

環境 Devise: 2.1.2, Rails: 3.2.9

DeviseのREADMEによると、
after_sign_in_path_for とか after_sign_out_path_for とかあるから
オーバーライドすれば自分の好きなようにカスタマイズ出来るよ!

って書いてあるんだけどいまいち出来ない。

確かに after_sign_in_path_for と after_sign_out_path_for は
ApplicationControllerあたりでオーバーライドすればオーバーライド出来るんだけど、
after_inactive_sign_up_path_for をオーバーライド出来ない。

なんで-、と思ってソースを見てみると、

class  Devise::RegistrationsController 
  ~~~
  def after_sign_up_path_for(resource)
    after_sign_in_path_for(resource)
  end

  def after_inactive_sign_up_path_for(resource)
    respond_to?(:root_path) ? root_path : "/"
  end
  ~~~
end

ってなってる。

after_sign_in_path_for はオーバーライド出来るから、
ApplicationControllerの祖先に Deviseのヘルパーメソッド群はいるけど
Devise::RegistrationsControllerはいないんでしょうね。

でもやっぱり after_inactive_sign_up_path_for の遷移先を変更したいから、
Devise::RegistrationsControllerを継承したコントローラーを作成してそのコントローラーを使うようにする。

$ rails g controller registrations
$ vi app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController

  protected

    def after_inactive_sign_up_path_for(resource)
      仮登録完了後のページ
    end

end

で、このコントローラを使うようにする。

$ vi config/routes.rb
devise_for :users, :controllers => {:registrations => :registrations}

で、更に、コントローラー継承してオーバーライドしたりしなかったりすると、後で意味分かんなくなりそうなので、
Deviseの遷移先を規定値から変更する場合は全てDeviseのコントローラーを継承してオーバーライドすることにする。

$ rails g confirmations
$ vi app/controllers/registrations_controller.rb
class ConfirmationsController < Devise::ConfirmationsController

  protected

    def after_confirmation_path_for(resource_name, resource)
      本登録完了後のページ
    end

end

$ vi config/routes.rb
devise_for :users, 
  :controllers => {:registrations => :registrations, :confirmations => :confirmations}

今のところはこれで間に合ってる。