This 是Devise sessions#create 的来源:
def create
self.resource = warden.authenticate!(auth_options)
set_flash_message(:notice, :signed_in) if is_flashing_format?
sign_in(resource_name, resource)
yield resource if block_given?
respond_with resource, location: after_sign_in_path_for(resource)
end
--
问题
我认为您的问题将是您在设置 @just_signed_in 变量之前调用 super。据我所知,以这种方式调用super 将调用您尝试附加的整个方法[需要研究如何使用super do |var|]...
如果我的理论是正确的,这意味着您的 @just_signed_in 变量没有被设置,从而导致它无法使用。我最初假设after_sign_in_path_for 将是redirect,但由于它只是设置位置,它应该设置变量如果它正确完成
更新
我后来找到了reference you used:
class Admins::SessionsController < Devise::SessionsController
def create
super do |resource|
BackgroundWorker.trigger(resource)
end
end
end
修复
你需要做几件事:
确保您的 sessions_controller 覆盖工作正常
你还没有为你的sessions_controller 发布你的班级声明。这可能看起来很简单,但最简单的事情往往会导致最大的错误!
你需要有这个:
#config/routes.rb
devise_for :users, controllers: { sessions: "your/sessions" }
#app/controllers/sessions_controller.rb
Class SessionsController < Devise::SessionsController
...
end
-
确保您的 @just_signed_in 变量已设置
由于多种原因(重定向等),您的变量可能在视图中不可用。我强烈建议设置一些logs 来跟踪您是否设置了@just_signed_in 变量:
#app/controllers/sessions_controller.rb
def create
super do |resource|
@just_signed_in = true
Rails.logger.info(@just_signed_in.inspect)
end
end
这至少可以确认变量是否已设置(因此会有其他问题)
-
查看@just_signed_in 的可用位置
在第二步之后,我会尝试查看@just_signed_in 的可用位置。为此,我会将值附加到您的 resource,然后在您的 after_sign_in_path_for(resource) 方法中使用 logger:
#app/models/user.rb
Class User < ActiveRecord::Base
attr_accessor :just_signed_in
end
#app/controllers/sessions_controller.rb
def create
super do |resource|
resource.just_signed_in = true
end
end
def after_sign_in_path_for(resource)
Rails.logger.info(resource.just_signed_in.inspect)
end
我希望这会有所帮助 - 我不知道这是否会奏效,但它肯定会创造一个更好的环境来发现答案!