【问题标题】:Easy Rails Issue: Global User Variable?Easy Rails 问题:全局用户变量?
【发布时间】:2012-11-16 16:23:49
【问题描述】:

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

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

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

最好的方法是什么?

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 嘿,谢谢!我想这就是我需要的。对于那些有同样问题的人,我只是在我的会话控制器“创建”方法中添加了一个新声明,session[:firstname] = user.first_name。谢谢大佬!
    【解决方案2】:

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

    【讨论】:

    • 但它在application_controller中,不应该是私人工作吗?如果不是,它是私有的?
    • 私有方法只属于ApplicationController,但是你从视图中运行方法。
    【解决方案3】:

    通常,视图不能调用控制器方法。但是,如果您愿意,您可以在特定方法中允许这样做,例如

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

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

    如果不先了解它对性能的影响有多大,我也会稍微谨慎地在会话中仅存储用户名作为优化

    【讨论】:

    • 是什么让你对此保持警惕?似乎任何会话数据都会比每次页面加载时查询数据库更有效。
    • 另外,-- 只是用谷歌搜索了 helper_method,它为确切的问题提供了一个解决方案。 apidock.com/rails/AbstractController/Helpers/ClassMethods/…
    • 让我警惕的是过早的优化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多