0

次のような http パラメータにApplicationController一致するユーザー オブジェクトを取得するために、_before_filter_ を使用しようとしています。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

これは、何らかの方法で設定されているように見えるUsersControllerApplicationController と呼ばれるコントローラーを除いて、継承するすべてのコントローラーで機能します。@usernil

この動作の理由は何ですか? そして、これは標準的な動作ですか?それを回避/無効にする方法は?

アップデート:

私は常にuser_idコントローラーに呼び出されるパラメーターを渡します。exact same before filterUsersController に直接インクルードすると、動作します! 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 を持つユーザーは確実に存在します。

ご協力いただきありがとうございます!

4

1 に答える 1

1

point.1 で UsersController を取得すると、params[:id] が 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
于 2012-05-28T08:38:49.187 に答える