[英]Devise: logic using `admin_signed_in?` when Admin & User logged in on separate tabs in same browser
在我的Rails 3.2应用程序中,有两个Devise模型:User和Admin。 我有一个评论部分表格,两者都可以用来在帖子上发表评论。 但是,我在* _signed_in中包括了条件逻辑吗? Devise提供的帮助程序,以便管理员可以看到一个复选框,允许他们使评论仅对其他管理员可见。 表单复选框代码:
- if admin_signed_in?
.pull-right
= label_tag :internal, "Private"
= f.check_box :internal
这不是一个大问题,因为它永远不会在生产中发生,但是在开发和阶段中,我注意到,如果某人(测试人员等)以管理员和用户的身份登录到同一浏览器的不同选项卡中,则逻辑的表单不起作用,因为(我猜?)这两个选项卡使用相同的cookie /会话信息/任何内容。 由于管理员在另一个选项卡上登录,因此该复选框显示在用户的表单上。 如果使用两种不同的浏览器,则效果很好。
有办法避免这种情况吗?
您可能需要查找或创建一个变量,该变量可用于确定您是否属于站点的管理员部分。 一种俗气的方法是在您的管理控制器中放置一个before过滤器,以设置实例变量(例如,@ admin_site = true),然后通过以下方式更新您的局部过滤器:
- if admin_signed_in? && @admin_site
.pull-right
= label_tag :internal, "Private"
= f.check_box :internal
但是,某些人(例如Sandi Metz)认为扩散发送到视图的实例变量是不明智的做法。 同样,将参数作为局部变量显式传递给局部变量也是一个好主意,而不是依赖于实例变量。 (这有助于提高可读性,并且更容易共享它们)。
外观模式可以在这里提供帮助。
http://robots.thoughtbot.com/sandi-metz-rules-for-developers
编辑:
由于使用了外墙,所以我通常会拒绝助手,但是您可能可以执行以下操作:
#app/helpers/application_helper.rb
module ApplicationHelper
def show_internal?
request[:controller].in? ['admin']
end
...
假设您的管理员操作全部在名为“ admin_controller”的控制器中。
您可以通过添加到数组来添加更多的管理控制器(如果有):
request[:controller].in? ['user_admin', 'product_admin']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.