1

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

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

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

我的问题是我不小心让真实用户无法登录。只要真实用户按下“登录”链接,他们就会被告知他们已经登录(作为演示用户)。

很明显,我所做的与“最佳实践”相去甚远。在这种情况下,聪明的程序员会怎么做?如何让我漂亮的自动登录演示用户保持登录状态,但仍然让真实用户登录?

4

3 回答 3

3

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

before_filter :set_current_user, :except => :new

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

skip_before_filter :set_current_user, :only => [:new, create]
于 2013-03-15T15:07:54.997 回答
1

您的set_current_user函数在 abefore_filter中,这意味着它为每个请求运行一次。这current_user将是nil任何人第一次访问,因此他们将作为演示用户登录。您可以跳过before_filter您的sessions_controller#create操作(或在您的应用程序中调用的任何内容。例如,如果您使用的是设计:

class SessionsController < Devise::SessionsController
  skip_before_filter :set_current_user, :only => :create
end
于 2013-03-15T15:12:57.777 回答
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
于 2013-03-16T13:08:39.230 回答