我有一堆不同的控制器,我希望能够做标准的"欢迎,用户"。 如何分配用户变量以使其可以从任何控制器访问?
以下是到目前为止我在应用程序控制器中拥有的内容:
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
这是我的应用程序.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
最好的方法是什么?
谢谢!
如果您只想将用户名嵌入到欢迎消息中,我可能只是将其存储在会话中(作为优化,以防止每次都获取它),然后创建一个显示的部分
Hello, <%= session[:username] %>
并在布局中或要显示此消息的任何位置包含部分。
如果您正在寻找的不仅仅是用户名或少量此类数据,那么部分仍然是显示它的最佳选择,但是从数据库中获取信息before_filter加载数据(如 MrYoshiji 建议的那样),可能是一个好主意。
current_user
是一个私有方法,公开执行,您的代码可能会正常工作。
通常,视图不能调用控制器方法。但是,如果您愿意,您可以允许对特定方法执行此操作,例如
class ApplicationController < ActionController::Base
...
def current_user
...
end
helper_method :user
end
用户是每次都从数据库中获取还是在会话中存储了一些数据并不重要,但您的视图不应与该详细信息相关联。
我也会稍微谨慎地将用户名作为优化存储在会话中,而不首先了解它会产生多大的性能差异