Ruby on Rails登录后设计代码

who*_*gnu 9 ruby-on-rails devise warden

我有一个使用Devise进行登录的RoR应用程序.创建新用户记录时会执行一些代码,方法是将user.rb文件作为after_create调用/ macro/whatever放入.我需要在每次登录后运行此代码,而不是在新用户创建时运行.

通过一些谷歌搜索,似乎有一个选项是在devise.rb代码中放置Warden回调.我的问题是:

  1. 这是对的吗,和/或有没有更好的方法来做到这一点?
  2. 如果这是正确的方法......
    • Warden :: Manager ...方法defs应该在Devise.setup中的devise.rb中,还是在它之后?
    • after_authentication我应该使用回调吗?我只是检查是否存在基于用户名的目录,如果不存在,则创建它.

Ash*_*aka 20

只是将Devise的会话控制器子类化并将您的自定义行为放在那里:

# config/routes.rb
devise_for :users, :controllers => { :sessions => "custom_sessions" }
Run Code Online (Sandbox Code Playgroud)

然后像这样创建你的控制器:

# 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
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案.#after_sign_in_path_for不应该用作任意post signin回调,因为它可以用于在任何时间点获取后签到路径.另外,devise在模型上提供了一个["after_database_authentication"](http://www.rubydoc.info/github/plataformatec/devise/master/Devise/Models/DatabaseAuthenticatable#after_database_authentication-instance_method),但是@ Ashitaka的回复保持适当的控制器级别.虽然,Ashitaka,如果您可以包含代码来检测成功登录状态,那将会很棒 (4认同)
  • 实际上,看起来如果登录不成功,则不会运行after_login,可能是由于401 warden异常或其他原因.因此,只有成功登录才会运行after_login (3认同)

小智 6

我发现在登录事件捕获后通过查找":set_user":事件干净地允许使用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
Run Code Online (Sandbox Code Playgroud)


Sau*_*abh 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
Run Code Online (Sandbox Code Playgroud)

参考成功登录 Devise 后可以执行自定义操作吗?

您还可以继承 devise session 的类并使用 after_filter 进行登录。