0

我試圖用一個_before_filter_在我ApplicationController獲取用戶對象的HTTP參數匹配user_id像以前那樣抓取應用程序控制器對象:的Rails 3.2過濾

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 

這在所有的工作對我來說控制器,它從ApplicationController繼承,除了名爲UsersController的控制器其中@user似乎以某種方式設置爲nil

這種行爲的原因是什麼?這是標準行爲嗎?如何避免/禁用它?

UPDATE:

我總是通過一個叫user_id控制器參數。 如果我將exact same before filter直接包含到UsersController中,它正在工作!

路線這是使用用戶控制器

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

用戶控制器代碼:

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

有 那裏之前在UsersController

UPDATE 2濾波器是沒有其他肯定是一個id爲id的用戶通過user_id參數,因爲

感謝您的幫助!

+1

UsersController中有什麼?是否因爲通常在用戶控制器中,用戶ID通常是params [:id]而不是params [:user_id]? –

+0

參數名稱始終爲user_id – alex

+0

@alex:否,如果您在'UsersController'中,則參數是(或它應該是)'param [:id]'。 – tokland

回答

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 
+0

參數名稱始終是user_is – alex

+0

您的意思是,您始終將其作爲「user_id」傳遞給它? –

+0

按照軌道約定,對於用戶控制器,您可以在params [:id]中獲得用戶標識,對於其他控制器,例如,/ users /:user_id/resources /:id,你會得到params [:user_id] –