0

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

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

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

最好的方法是什么?

谢谢!

4

3 回答 3

0

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

于 2012-11-16T16:38:38.670 回答
0

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

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

并将部分包含在您的布局中,或者您想要显示此消息的任何位置。

如果您要查找的不仅仅是用户名或类似的少量数据,部分仍然是显示它的最佳选择,但要从数据库中获取信息,请使用 before_filter 加载数据(如 MrYoshiji 所建议),可能是个好主意。

于 2012-11-16T16:32:35.997 回答
0

通常,视图不能调用控制器方法。但是,如果您愿意,您可以允许对特定方法执行此操作,例如

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

用户每次是从数据库中获取还是在会话中存储了一些数据并不重要,但是您的视图不应该与该细节耦合。

在不首先了解它对性能的影响有多大的情况下,我也会对在会话中仅存储用户名作为优化稍有警惕

于 2012-11-16T16:49:45.520 回答