Ruby 在 Rails 路由上 - 查询参数与 id

Ruby on Rails routes - Query parameter vs id

我正在尝试设置接受动态字段的路由。餐厅有类别 [:chinese, :fast_food, :french, :vegan] 并且路由 restaurants/vegan 允许在索引操作中 return 该类别下的餐厅列表(请求仅 /restaurants 然后它 return所有餐厅),这是有效的。

但是 show 动作不起作用,因为它卡在了 index 动作中。 "restaurant/2" 不起作用,因为索引操作查找类别 2,而 2 是 restaurant.id

有什么方法可以区分这两个动态字段吗?

提前致谢

routes.rb

  get "restaurants/:category", to: "restaurants#index"
  resources :restaurants, only: [:index, :show, :new, :create, :destroy]

restaurants_controller

def index
    raise
    if params[:category]
      @restaurants = Restaurant.where(categories: params[:category])
    else
       @restaurants = Restaurant.all
    end
end

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

因为您在与 :id 相同的位置有一个动态路段,所以您必须在路线上使用限制条件。

https://guides.rubyonrails.org/routing.html#segment-constraints


# `restaurants/1` will be ignored
# `restaurants/anything-else` will be routed to RestaurantsController#index
get 'restaurants/:category',
   to: 'restaurants#index',
   constraints: { category: /[^0-9]+/ }

resources :restaurants