2017-07-30 58 views
0

我正嘗試在Ruby on Rails應用程序中爲每個餐廳創建一個信息頁。我在Restaurant controller中創建了一個動作info,並在routes.rb中添加了一行。但它給出了一個錯誤用Ruby on Rails爲每個餐廳創建信息頁

「的ActiveRecord :: RecordNotFound在RestaurantsController#信息」 無法找到 與餐廳 '身份證'= ..

什麼是錯我的代碼?

這是我的餐廳控制器:

class RestaurantsController < ApplicationController 
before_action :set_restaurant, only: [:show, :edit, :update, :destroy, :info] 

    def info 
    end 

    private 
    def set_restaurant 
    @restaurant = Restaurant.find(params[:id]) 
    end 
end 

這是我的routes.rb:

Rails.application.routes.draw do 

resources :restaurants do 
    get '/info', to: 'restaurants#info' 
end 

end 

這一個鏈接到餐館信息頁面:

<%= link_to 'Info', restaurant_info_path(@restaurant) %> 
+0

你在哪個頁面有這條線<%= link_to'Info',restaurant_info_path(@restaurant)%>'? – Pavan

+0

謝謝您的回覆!在餐廳展示頁面。 – sevmilber

回答

1

的ActiveRecord :: RecordNotFound在RestaurantsController#信息

通過具有自定義路由嵌套resources :restaurants,生成具有錯鍵的路線。當您運行rake routes,你可以看到這條路線

restaurant_info GET /restaurants/:restaurant_id/info(.:format) restaurants#info 

所以這條路線有:restaurant_id:id。所以你不能這樣做params[:id]來獲取這一行@restaurant = Restaurant.find(params[:id])這裏的值,該錯誤會失敗。更改params[:id]params[:restaurant_id]應該解決您的問題,但這是不是正確的解決方案。

明顯的和理想的解決辦法是調整您的自定義路線,所以它可以像這樣

restaurant_info GET /restaurants/:id/info(.:format) restaurants#info 

產生你可以調整你的自定義路由下面來實現這一點,不具有該嵌套resources :restaurants

get 'restaurants/:id/info', to: 'restaurants#info', as: :restaurant_info 
resources :restaurants 
+0

非常感謝您的幫助和詳細的解釋 – sevmilber

+0

不會更好的REST路由是'餐館/:ID /信息'? –

+1

@ m.simonborg感謝您通知!我其實忘了編輯它:) – Pavan

0

這是因爲set_restaurant方法沒有得到任何參數,檢查並返回,如果它正確接收它們。