使用Null对象模式的Devise的访客用户

时间:2014-11-27 11:11:35

标签: ruby-on-rails ruby authentication ruby-on-rails-4 devise

我正在尝试在设计中实现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

1 个答案:

答案 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