2013-03-15 40 views
1

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

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

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    before_filter :set_current_user 

    def demo_user 
    @demo_user ||= User.find_by_email("[email protected]") 
    end 

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

我的问题是我不小心,不可能真正的用户登录。任何时候,真正的用户按下连结的“符号”,他们告诉记者,他们已经登录(如演示用户)。

很明显,我所做的事情远不及“最佳实践”。一个聪明的程序员在这种情况下会做什么?如何保持我的漂亮自动登录演示用户,但仍然让真正的用户登录开放?

+0

为什么你需要一个假的用户又是什么,在用户未签名无法看到和登录的用户可以将内容?你如何停止未登录的用户不要看到它? 您还可以轻松让未登录的用户执行任何真实用户的操作(即创建帖子,删除帖子等)。 – Zippie 2013-03-15 15:06:29

+1

如何添加另一个按钮与登录演示用户,所以你不必在过滤器之前搞砸了? – 2013-03-15 20:26:22

回答

3

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

before_filter :set_current_user, :except => :new 

注意,这将跳过过滤器对所有“新”的行为,这样它会更针对性的方式(再次,假设你使用的设计)来创建自定义SessionsControllerDevise::SessionsController继承并让它空白,除了:

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

随着设计,你可能需要同时针对':new'和':create' – 2013-03-15 15:16:54

+0

好点,补充。 – omnikron 2013-03-15 15:17:58

+0

这绝对有道理。但我认为我可能还需要做更多的事情。我甚至无法登录登录页面。当我点击新会话的链接时,我仍然收到我已登录的消息。作为预防措施,我重新启动了服务器,但我仍然得到相同的行为。 – 2013-03-15 15:48:27

1

set_current_user功能处于before_filter这意味着它为每个请求运行一次。任何人第一次访问时,current_user将为nil,因此他们将以演示用户的身份登录。你可以跳过before_filtersessions_controller#create行动(或任何它被称为在你的应用程序。例如,如果您使用的设计。

class SessionsController < Devise::SessionsController 
    skip_before_filter :set_current_user, :only => :create 
end 
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