2016-01-22 87 views
0

我希望用戶擁有自己的頁面/ users/52。所以我確實添加了一個新的控制器來實現這一點,控制器是user_controller.rb。 但是現在,其他功能不起作用。Devise - ActiveRecord :: RecordNotFound

當我有像下面的路線。/users/sign_in不起作用。 但/用戶/ 1確實工作。

#Users/show!!! 
    match 'users/:id' => 'users#show', via: :get 
    # or 
    get 'users/:id' => 'users#show' 
    # or 
    resources :users 

    devise_for :users, controllers: { 
      sessions: 'users/sessions' 
    } 

當我使用的路線如下圖所示。/users/1不工作,但用戶/登錄工作。


 

 
    devise_for :users, controllers: { 
 
      sessions: 'users/sessions' 
 
    }

class UsersController < ApplicationController 
 

 
#def show 
 
# \t @user = User.friendly.find(params[:id]) 
 
# \t @links = Link.all.where(user_id: @user).publish 
 
#end 
 

 
def index 
 
\t @users = User.all 
 
end 
 

 
def show 
 

 
\t @user = User.friendly.find(params[:id]) 
 
\t @links = Link.all.where(user_id: @user).publish 
 
end 
 

 
def new 
 
\t 
 
end 
 

 

 

 
end

+0

沒有創造您嘗試登入的用戶,該錯誤意味着自己是不是在數據庫中找到(最有可能的用戶) – bjhaid

+0

用戶創建。因爲我可以登錄到網站,如果我刪除這些行:match'users /:id'=>'users#show',via :: get #or get'users /:id'=>'users#show' #或 資源:用戶 – VictorBlomberg

+0

你有沒有嘗試'資源:用戶,只:[:show]'?恐怕其他選項將不起作用,因爲devise操作將被解釋爲一個ID(即在'/ users/sign_in'中,new將作爲'id:'sign_in''傳遞給您的UsersController)。另外,除非將'resources'限制爲':show',否則它可能會掩蓋設備的路由。 – taglia

回答

0

我想你只需要到色器件聲明之後移動resources :users(或其他的你也有變種)。首先映射的映射在路由文件中具有優先權,因此所有獲取'users/anything'類型的請求都將與您的用戶匹配#show action並且永遠不會到達設備控制器。讓我們看看以下的例子:

當用戶試圖訪問users/sign_in,軌道開始的匹配與你的路由文件的映射路徑,從上到下,當它到達users/:id,它假定「sign_in」是指爲值爲:id(因爲路徑結構匹配),所以它選擇了users#show動作,並且如果您查看show動作中的參數,您將看到id已給出值'sign_in'。

如果你把users/:id映射devise_for塊之後,然後輸入通路將首先被更廣泛users/:id

所以匹配更嚴格的映射(例如,僅路徑users/sign_in將匹配的users/sign_in的映射),然後,在短:

devise_for :users, controllers: { 
     sessions: 'users/sessions' 
} 
resources :users 

將工作。

+0

非常感謝你....那簡單... – VictorBlomberg

0

發生了什麼事是,當請求 「用戶/ sing_in」 控制器正在尋找ID爲 「sign_in」 的記錄,這種記錄沒有按」 t存在,因此activerecord未找到錯誤。

您應該將獲得 '用戶/:身份證'=> '用戶#秀' 後 「devise_for」 塊,而不是

相關問題