2017-07-30 31 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方法没有得到任何参数,检查并返回,如果它正确接收它们。