Easy Rails问题:全局用户变量?

时间:2012-11-16 16:23:50

标签: ruby-on-rails model-view-controller global-variables

我有一堆不同的控制器,我希望能够做到标准的“欢迎,用户”。如何分配用户变量以便可以从任何控制器进行访问?

这是我到目前为止在应用程序控制器中的内容:

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

最好的方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:0)

如果你想要的只是能够将用户名嵌入到欢迎消息中,我可能只是将它存储在会话中(作为优化,以防止每次都取出它),然后创建一个显示的部分

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

并在您的布局中包含部分内容,或在您希望显示此消息的任何位置。

如果您正在寻找超过用户名或少量数据,那么部分仍然是您展示它的最佳选择,但是要从数据库中获取信息,请加载before_filter以加载数据(如MrYoshiji),可能是一个好主意。

答案 1 :(得分:0)

current_user是一种私有方法,公开发布,您的代码可能会正常工作。

答案 2 :(得分:0)

通常,视图无法调用控制器方法。但是,如果您愿意,可以将其用于特定方法,例如

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

每次是从数据库中提取用户还是在会话中存储了一些数据并不重要,但您的视图不应与该详细信息相关联。

我还会稍微小心谨慎地将会话中的用户名藏匿为优化而不首先了解它所带来的性能差异