我正在使用Devise 3.2.4。我用这个覆盖了SessionsController:
def create
super do |resource|
@just_signed_in = true
end
end
目标是能够在视图中使用变量@just_signed_in
,以便触发只应在登录时调用的前端JavaScript。以下是我after_sign_in_path_for(resource)
的定义方式:< / p>
def after_sign_in_path_for(resource)
return root_path
end
鉴于return root_path
,我认为不允许将@just_signed_in
传递给视图。用户登录后如何触发JavaScript?我错过了什么吗?
干杯,
答案 0 :(得分:1)
我认为你的变量不适用于视图的原因是因为respond_with
是在设置了@just_signed_in的块之后由设计create
执行的。如果一切都成功,那么此respond_with
将执行redirect_to
,因此您的@just_signed_in变量将无法生效,以便处理您的root_path
的控制器可用(请参阅navigation_behaviour()
在actionpack/lib/controller/metal
中的rails'actionpack中的ActionController模块中,显示redirect_to表示成功或呈现失败)。
解决此问题的一种方法是在Rich建议的情况下向resource
添加一个属性,然后您可以在视图中使用current_user
来获取它并检查/重置它(理想情况下是模型而不是视图)。如果您不想向资源/模型添加属性,则另一种方法是在会话中添加“刚刚登录”标志,并在视图中访问/删除它。即代替:
@just_signed_in = true
有:
session[:just_signed_in] = true
然后在您看来,执行以下操作:
if session.delete(:just_signed_in)
…whatever…
end
您可能希望在视图助手中隐藏它,特别是如果您需要在多个位置使用它。
答案 1 :(得分:0)
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
-
<强>问题强>
我认为您的问题是在设置super
变量之前,您正在调用@just_signed_in
。据我所知,以这种方式调用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
,然后在logger
方法中使用after_sign_in_path_for(resource)
来执行此操作:
#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
我希望这有帮助 - 我不知道这是否有效,但它肯定会创造一个更好的环境来发现答案!