Ruby on Rails登录后设计代码

时间:2014-01-21 20:35:20

标签: 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回调吗?我只是检查是否存在基于用户名的目录,如果不存在,则创建它。

3 个答案:

答案 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进行登录。