2012-11-16 44 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

什麼讓我擔心是不成熟的優化。 –