基本的なDevise認証を備えたアプリがあります。サインイン後、ユーザーアカウント(ユーザーbelongs_toアカウント、アカウントhas_many users)を検索し、それをセッションに保存して、@current_user
のように使用できるようにします。
このようなフォーメーションでセッションを保存するRails方法は何ですか?サインインが成功した後にコードを実行するためにDeviseで使用できるフックはありますか?
編集:これはかつては良い解決策でしたが、おそらくこれを処理するためのより良い方法があると考えてください。私は人々に別の選択肢を与え、歴史を保存するためにここに残しているだけです。反対票を投じないでください。
はい、できます。私が最初に見るリソースは http://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on-successful-sign-in 。また、いくつかのアイデアについては、 Rails devise gem? を使用して正常にサインアップしたときに特定のページにリダイレクトする方法)を確認してください。
次のようなことができます。
def after_sign_in_path_for(resource_or_scope)
session[:my_account] = current_user.account
profile_url
end
このメソッドは、ApplicationControllerまたはカスタムRegistrationsControllerに実装できます。
実際、DeviseでOmniauthとデータベースのログインモジュールを組み合わせた場合、受け入れられた回答は正しく機能しません。
Deviseで(ユーザー認証チャネルを無視して)サインインが成功するたびに実行されるネイティブフックは、warden.set_user(devisesign_inヘルパーによって呼び出されます: http: //www.rubydoc.info/github/plataformatec/devise/Devise/Controllers/SignInOut#sign_in-instance_method )。
ユーザーが正常にサインインした後にカスタムアクションを実行するには(Warden Docs: https://github.com/hassox/warden/wiki/Callbacks )、これを初期化子に入れます(例:after_sign_in.rbinconfig/initializers)
Warden::Manager.after_set_user except: :fetch do |user, auth, opts|
#your custom code
end
更新2015-04-30:@ seanlinsleyの提案(以下のコメントを参照)のおかげで、回答を修正してただし、:: fetchは、ユーザーが認証されたときにのみコールバックをトリガーし、設定されるたびにトリガーするためではありません。
更新2018-12-27Wardenに独自のコードを実行するための組み込みのコールバックがあることを指摘してくれた@thesecretmasterに感謝しますafter_authenticationhttps://github.com/wardencommunity/warden/wiki/Callbacks#after_authentication
私はRails 5とデバイス4.2.1を使用しています。私のソリューションはユーザーモデルのデバイス関数をオーバーライドすることです。
def after_database_authentication
# here's the custom code
end
ユーザーモデルは次のようになります。
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:timeoutable, :lockable
def after_database_authentication
# here's the custom code
end
end
それは認証の直後に呼び出されました、私はこれからそれを読みました ドキュメントを考案する 、これが役立つことを願っています
次のように、セッションコントローラーのcreate
メソッドをオーバーライドすることで、この問題を解決しました。
class Admin::SessionsController < Devise::SessionsController
def create
super
# here goes my code
# my settings, etc
# do something with current_admin.fullname, for example
end
end
つまり、認証が成功した場合(super
を呼び出すことにより)、設定を実行します。
アプリケーションコントローラーでは、アフターアクションを追加するだけです。
app/controllers/users/application_controller.rb
class ApplicationController < ActionController::Base
after_action :do_something
def do_something
# do something
end
end