2012-11-16 42 views
0

我有一堆不同的控制器,我希望能够执行标准的“欢迎,用户”。如何分配用户变量以便从任何控制器访问?Easy Rails问题:全局用户变量?

这里是我迄今为止在应用控制器:

class ApplicationController < ActionController::Base 
    before_filter :authorize 

    protect_from_forgery 

    private 

     def current_user 
      User.find(session[:user_id]) 
     end 

    protected 

    def authorize 
     unless User.find_by_id(session[:user_id]) 
      redirect_to login_url, :notice => "Please Login" 
     end 
    end 
end 

这是我的application.html.haml文件:

!!! 
%html 
    %head 
     %title Pears 
     = stylesheet_link_tag "application", :media => "all" 
     = javascript_include_tag "application" 
     = csrf_meta_tags 
    %body 
     %header 
      = link_to('Home', '/') 
      - if session[:user_id] 
       Welcome, 
       = current_user.firstname 
       = link_to('Logout', logout_path, method: :delete) 
      - else 
       = link_to('Login', login_path) 
       = link_to('Signup', signup_path) 
     = yield 

什么是最好的方法呢?

谢谢!

回答

0

如果你想要的是能够给用户名嵌入到一个值得欢迎的消息,我很可能只是将其存储在会话(作为优化,从获取它的每一次保持),然后创建一个部分是显示器

Hello, <%= session[:username] %> 

并包括部分布局或任何您想要显示此消息的位置。

如果您正在寻找不止一个用户名或少量数据,那么显示它仍然是您最好的选择,但要从数据库获取信息before_filter以加载数据(按照建议由MrYoshiji先生),可能是一个好主意。

+0

嘿感谢!我认为这是我需要的。对于那些有同样问题的人,我只是在会话控制器“create”方法session' [firstname] = user.first_name'中添加了一个新声明。谢啦! – jake

0

current_user是一个私有方法,做到公开,你的代码可能会被工作。

+0

但它在application_controller中,甚至不应该私人工作?如果不是,它是什么私人的? – jake

+0

私有方法只属于ApplicationController,但您从视图运行方法。 –

0

通常情况下,视图不能调用控制器方法。但是你可以让这个特定的方法,如果你愿意的话,例如

class ApplicationController < ActionController::Base 
    ... 
    def current_user 
    ... 
    end 
    helper_method :user 
end 

用户是否获取从数据库中的每个时间或具有存储在会话都无所谓了一些数据,但你的观点不应该不会与这个细节联系起来。

我也稍微谨慎了会议作为一个优化积攒只是用户名的。如果不了解多大的性能差异,将会使

+0

是什么让你对此有所警惕?看起来像任何会话数据比查询数据库的每个页面负载更有效。 – jake

+0

此外, - 只是使用helper_method,它给出了一个确切的问题的解决方案。 http://apidock.com/rails/AbstractController/Helpers/ClassMethods/helper_method – jake

+0

什么让我担心是不成熟的优化。 –