0

我正在尝试在 Ruby on rails 应用程序中为每家餐厅创建一个信息页面。我创建了一个动作info我在中Restaurant controller并在routes.rb. 但它给出了一个错误

“ActiveRecord::RecordNotFound in RestaurantsController#info”找不到具有 'id'=.. 的餐厅

我的代码有什么问题?

这是我的餐厅控制器:

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

这是我的路线.rb:

Rails.application.routes.draw do

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

end

这是餐厅信息页面的链接:

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

2 回答 2

1

ActiveRecord::RecordNotFound in RestaurantsController#info

通过将自定义路由 嵌套在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
于 2017-07-30T16:05:51.773 回答
0

这是因为该set_restaurant方法没有获得任何参数,请检查并返回是否正确接收它们。

于 2017-07-30T15:50:11.857 回答