Ruby on rails RubyonRails全局变量?
我试图将当前用户设置为一个变量,以便在每个页面上显示“作为Joe登录”。不确定从哪里开始 有什么快速提示吗?具体来说,像这样的东西应该放在什么文件中 我的当前用户可以定义为(我想):Ruby on rails RubyonRails全局变量?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我试图将当前用户设置为一个变量,以便在每个页面上显示“作为Joe登录”。不确定从哪里开始 有什么快速提示吗?具体来说,像这样的东西应该放在什么文件中 我的当前用户可以定义为(我想):user.find\u by\u id(session[:user\u id]) TY:)它属于您的控制器。正是出于这个原因,您的所有控制器都从应用程序控制器中继承了RIT。在应用程序控制器中创建一个方法,该方法返回您需要的任何内容,然后您可以在任何其他控制器中访问它。您可能希望使用类似Authlogic或Desiv
user.find\u by\u id(session[:user\u id])
TY:)它属于您的控制器。正是出于这个原因,您的所有控制器都从应用程序控制器中继承了RIT。在应用程序控制器中创建一个方法,该方法返回您需要的任何内容,然后您可以在任何其他控制器中访问它。您可能希望使用类似Authlogic或Desive的方法来处理此问题,而不是滚动您自己的auth系统,尤其是当您不太熟悉Rails应用程序中常见的设计模式时 也就是说,如果您想执行问题中的要求,您可能应该在ApplicationController中定义一个方法,如下所示:
def current_user
@current_user ||= User.limit(1).where('id = ?', session[:user_id])
end
您从所有常规控制器上的ApplicationController继承,因此它们都可以访问current\u user
方法。此外,您可能希望在视图中作为辅助对象访问该方法。Rails也会为您提供这方面的帮助(同样在您的ApplicationController中):
注意:如果使用find_by_x方法,如果不返回任何内容,则会引发ActiveRecord::RecordNotFound错误。您可能不希望这样,但您可能希望采取一些措施来防止非用户访问仅限用户的资源,再说一遍,Rails已经介绍过:
class ApplicationController < ActionController::Base
protect_from_forgery
helper_method :current_user
before_filter :require_user
private
def current_user
@current_user ||= User.limit(1).where('id = ?', session[:user_id])
end
def require_user
unless current_user
flash[:notice] = "You must be logged in to access this page"
redirect_to new_session_url
return false
end
end
end
class ApplicationController
干杯 是否有一个全局变量可以设置一次,或者我需要在每个控制器中设置一次?masedesign:如果在不同的位置定义一个变量,它不是全局变量。由于所有其他控制器都继承自
ApplicationController
,因此可以在ApplicationController
中定义一个类变量(类似于@@foo=42
),然后在其他控制器中读取并设置它。它不会是一个全局变量,但如果只需要控制器,那么就足够接近了。很漂亮,这非常有用!
class ApplicationController < ActionController::Base
protect_from_forgery
helper_method :current_user
before_filter :require_user
private
def current_user
@current_user ||= User.limit(1).where('id = ?', session[:user_id])
end
def require_user
unless current_user
flash[:notice] = "You must be logged in to access this page"
redirect_to new_session_url
return false
end
end
end