我有一个使用Devise进行登录的RoR应用程序。创建新用户记录时会执行一些代码,方法是将user.rb文件作为after_create调用/ macro / whatever放入。我需要在每次登录后运行此代码,而不是在新用户创建时运行。
通过一些谷歌搜索,似乎有一个选项是在devise.rb代码中放置Warden回调。我的问题是:
答案 0 :(得分:19)
只需子类Devise's sessions controller并将自定义行为放在那里:
# config/routes.rb
devise_for :users, :controllers => { :sessions => "custom_sessions" }
然后像这样创建你的控制器:
# app/controllers/custom_sessions_controller.rb
class CustomSessionsController < Devise::SessionsController
before_filter :before_login, :only => :create
after_filter :after_login, :only => :create
def before_login
end
def after_login
end
end
答案 1 :(得分:6)
我发现在登录事件捕获后通过查找“:set_user”:event来干净地使用Devise Warden钩子。
在user.rb中:
class User < ApplicationRecord
Warden::Manager.after_set_user do |user, auth, opts|
if (opts[:scope] == :user && opts[:event] == :set_user)
# < Do your after login work here >
end
end
end
答案 2 :(得分:0)
我认为这是一个重复的问题。是的,您可以在每次成功登录后执行代码。您可以在ApplicationController中编写代码。另请查看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)
Your Code Here
end
参考Can I execute custom actions after successful sign in with Devise?
你也可以继承设计会话的类,并使用after_filter进行登录。