Ruby on rails RubyonRails全局变量?

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

我试图将当前用户设置为一个变量,以便在每个页面上显示“作为Joe登录”。不确定从哪里开始

有什么快速提示吗?具体来说,像这样的东西应该放在什么文件中

我的当前用户可以定义为(我想):
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