我设置了一个假用户来演示我的应用。我们的想法是,未登录的访问者仍应能够看到真实用户可能拥有的所有功能。当未登录的访问者访问该网站时,该应用程序将登录该演示用户,访问者将看到属于该演示用户的虚假数据。
考虑到这个目标,我设置了这样的应用程序控制器。
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>
很明显,我所做的并不是“最佳实践”。智能程序员在这种情况下会做什么?如何保持我的漂亮自动登录演示用户,但仍然让真正的用户可以登录?
答案 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