传递变量以在 DeDesigning 中查看
Pass variables to view within Devise
我正在使用Devise 3.2.4。我用这个覆盖了会话控制器:
def create
super do |resource|
@just_signed_in = true
end
end
目标是能够在视图中使用变量@just_signed_in
,以触发仅在登录时调用的前端 JavaScript。以下是我的after_sign_in_path_for(resource)
的定义:
def after_sign_in_path_for(resource)
return root_path
end
鉴于return root_path
,我认为这不允许将@just_signed_in
传递给视图。如何在用户登录后触发 JavaScript?我错过了什么吗?
干杯
我认为您的变量对视图不可用的原因是 devise 的create
在屈服于设置@just_signed_in的块后执行的respond_with
。 如果一切都成功,那么这个respond_with
将执行一个redirect_to
,所以你的@just_signed_in变量将无法存活下来,无法提供给处理你的root_path
的控制器(参见actionpack/lib/controller/metal
中rails操作包中ActionController模块中的navigation_behaviour()
,其中显示了成功的redirect_to或失败的渲染(。
解决此问题的一种方法是按照 Rich 的建议向resource
添加一个属性,然后您可以使用视图中的current_user
来获取它并检查/重置它(理想情况下,在模型中使用逻辑而不是视图(。 如果不想向资源/模型添加属性,另一种方法是将"刚登录"标志放在会话中,然后在视图中访问/删除它。 即代替:
@just_signed_in = true
有:
session[:just_signed_in] = true
然后在您的视图中,执行以下操作:
if session.delete(:just_signed_in)
…whatever…
end
您可能希望在视图帮助程序中隐藏它,尤其是在多个位置需要它时。
这是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
,但由于它只是设置位置,如果正确完成,它应该设置变量
更新
此后,我找到了您使用的参考资料:
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
我希望这有所帮助 - 我不知道这些是否有效,但它肯定会创造一个更好的环境来发现答案!
- 将函数的上下文应用于javascript变量
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- 将PHP变量传递给jQuery时遇到问题
- 如何通过ajax刷新JSF填充的javascript变量
- 参数变量出现ngTable指令问题
- 通过javascript重定向html传递php变量
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 全局变量和全局对象的属性之间有什么区别吗
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 值对象在某个变量发生更改后发生更改
- Javascript变量赋值|
- AngularJS-在JSON选择器中使用变量名
- Javascript计数器变量未显示正确的值
- delete关键字在全局变量上的不同行为
- 如何在php变量中嵌入JQuery代码
- ReactJS映射:如何仅在url变量不为空时呈现html链接
- 在javascript函数中设置全局变量
- 将变量传递给外部Javascript
- 传递变量以在 DeDesigning 中查看