Rails 3.2在过滤之前在应用程序控制器中获取对象

时间:2012-05-28 08:28:32

标签: ruby-on-rails ruby ruby-on-rails-3 inheritance activerecord

我正在尝试在ApplicationController中使用_before_filter_来获取与http参数中的user_id匹配的用户对象,如:

before_filter :fetch_user

def fetch_user
  if params[:user_id].present?
    @user = User.find(params[:user_id])
  end
  rescue ActiveRecord::RecordNotFound
  # user not found
end

除了名为UsersController 的控制器(其中ApplicationController似乎设置为@user)之外,所有继承自nil 的控制器都适用于我以某种方式。

这种行为可能是什么原因?这是标准行为吗?如何避免/禁用它?

更新

我总是将一个名为user_id的参数传递给控制器​​。 如果我将exact same before filter直接包含在UsersController中,它就可以了! UsersController中没有其他过滤器

更新2:

用于用户控制器的路由

match ':user_id' => 'users#show'

用户控制器代码:

  def show
    if @user     
      render :text => "user not nil"
    else
      render :text => "user nil"
   end
  end

肯定有一个用户在user_id参数处传递了id,因为

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

用户控制器中的

point.1,你得到params [:id] as user_id

point.2使用find_by_id来避免救援ActiveRecord :: RecordNotFound,它安全地返回nil

等......

def fetch_user
  user_id = controller_name=='users' ? params[:id] : params[:user_id]
  @user ||= User.find_by_id user_id
end