在 Rails 上为 Ruby 的每家餐厅创建信息页面

Create info page for each restaurant with Ruby on Rails

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

"ActiveRecord::RecordNotFound in RestaurantsController#info" Couldn't find Restaurant with '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

这是我的routes.rb:

Rails.application.routes.draw do

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

end

这是 link 餐厅信息页面:

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

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

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