如何为演示目的设置默认current_user

时间:2013-03-15 15:02:28

标签: ruby-on-rails devise

我设置了一个假用户来演示我的应用。我们的想法是,未登录的访问者仍应能够看到真实用户可能拥有的所有功能。当未登录的访问者访问该网站时,该应用程序将登录该演示用户,访问者将看到属于该演示用户的虚假数据。

考虑到这个目标,我设置了这样的应用程序控制器。

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_current_user

  def demo_user
    @demo_user ||= User.find_by_email("demo@example.com")
  end

  protected
    def set_current_user
      if current_user.nil?
        sign_in(demo_user)
      end
    end
end

我的问题是我无意中让真正的用户无法登录。无论何时真实用户按下“登录”链接,他们都会被告知他们已经登录(作为演示用户)。 / p>

很明显,我所做的并不是“最佳实践”。智能程序员在这种情况下会做什么?如何保持我的漂亮自动登录演示用户,但仍然让真正的用户可以登录?

3 个答案:

答案 0 :(得分:3)

您需要向:except添加:before_filter,以便它不会在sign_in操作上运行,无论它是什么。假设您正在使用设计,那将是SessionsController#new,所以它看起来像:

before_filter :set_current_user, :except => :new

请注意,这将跳过所有“新”操作的过滤器,因此更具针对性的方法是(再次假设您使用Devise)创建继承自{SessionsController的自定义Devise::SessionsController 1}}并将其留空,除了:

skip_before_filter :set_current_user, :only => [:new, create]

答案 1 :(得分:1)

您的set_current_user函数位于before_filter中,这意味着它会针对每个请求运行一次。任何人第一次访问时current_user将为nil,因此他们将以演示用户身份登录。您可以跳过before_filter sessions_controller#create操作(或在您的应用中调用的任何操作。例如,如果您使用的是Devise:

class SessionsController < Devise::SessionsController
  skip_before_filter :set_current_user, :only => :create
end

答案 2 :(得分:0)

这是我最终的结果。我开始使用Omnikron的解决方案,但我还需要更多。

这篇文章帮助:https://groups.google.com/forum/#!msg/plataformatec-devise/0WylcwjSAJY/ITDF6kFjJvwJ

class SessionsController < Devise::SessionsController
  skip_before_filter :set_current_user, only: [:new, :create]
  skip_before_filter :require_no_authentication, :only => [:new, :create]

  def new
    if user_signed_in?
      sign_out current_user
      redirect_to new_user_session_path
    else
      super
    end
  end
 end