我正在尝试在设计中实现Guest
用户,但是这样做user_signed_in?
始终评估为true
我该如何解决这个问题?
我无法使用signed_in?
,因为我有Admin
以及User
所以如果我在管理面板上登录然后转到主网站它会认为我如果我使用signed_in?
这是代码
应用程序控制器
def current_user
if devise_controller?
@current_user = super
else
@current_user ||= super || Guest.new
end
end
查看
<p>Welcome <strong><%= current_user.first_name %></strong></p>
<ul>
<% if user_signed_in? %>
<li>
<%= link_to 'Sign out', destroy_user_session_path,
method: :delete %>
</li>
<% else %>
<li><%= link_to 'Sign up', new_user_registration_path %></li>
<li><%= link_to 'Sign in', new_user_session_path %></li>
<% end %>
</ul>
更新
我已经决定覆盖user_signed_in?
方法,同时if devise_controller?
正在破坏我的测试,因此我将其取出并将ApplicationController
更改为现在看起来像这样。
应用程序控制器
def current_user
@current_user ||= super || Guest.new
end
def user_signed_in?
current_user.is_a? User
end
答案 0 :(得分:0)
Devise在此处定义user_signed_in?
:
def self.define_helpers(mapping) #:nodoc:
mapping = mapping.name
class_eval <<-METHODS, __FILE__, __LINE__ + 1
def authenticate_#{mapping}!(opts={})
opts[:scope] = :#{mapping}
warden.authenticate!(opts) if !devise_controller? || opts.delete(:force)
end
def #{mapping}_signed_in?
!!current_#{mapping}
end
def current_#{mapping}
@current_#{mapping} ||= warden.authenticate(scope: :#{mapping})
end
def #{mapping}_session
current_#{mapping} && warden.session(:#{mapping})
end
METHODS
ActiveSupport.on_load(:action_controller) do
if respond_to?(:helper_method)
helper_method "current_#{mapping}", "#{mapping}_signed_in?", "#{mapping}_session"
end
end
end
在这种情况下,您可以向!
类添加Guest
方法
class Guest
def !
true
end
end