Rails 6 路线 - 如何添加自定义“新”路线?
Posted
技术标签:
【中文标题】Rails 6 路线 - 如何添加自定义“新”路线?【英文标题】:Rails 6 routes - how to add custom "new" route? 【发布时间】:2021-08-17 07:39:10 【问题描述】:我想添加一个自定义的 Rails 路线 - 默认方式是这样的:
/cars/new
我想保持这条路线可用,也想添加这样一条路线:
/cars/new/:manufacturer_slug
然后在视图/控制器中检查参数中的内容并根据该显示不同的内容。
我该怎么做?
我尝试通过资源添加,比如
resources :end do
get 'new/:manufacturer_slug', to: 'cars#new'
end
或
resources :end do
member do
get 'new/:manufacturer_slug', to: 'cars#new'
end
end
但两个版本都不起作用 - 在这两种情况下,我都会收到关于错误 URL 的错误。
【问题讨论】:
【参考方案1】:resources :cars do
collection do
get 'new/:manufacturer_slug', to: 'cars#new'
end
end
或
get 'cars/new/:manufacturer_slug', to: 'cars#new'
用rails routes
检查结果。
或者您可以在 url 末尾添加参数:
/cars/new?manufacturer_slug=anything
【讨论】:
【参考方案2】:declare a nested resource 是一个更 RESTful、传统且完全更好的解决方案。
resources :manufacturers, only: [] do
resources :cars,
only: [:new, :create],
module: :manufacturers
end
这将声明路由/manufacturers/:manufacturer_id/cars/new
。仅仅因为参数被称为manufacturer_id
并不意味着您不能使用 slug 代替主键。标识符是你想要的任何东西。
这条路线不那么不稳定,因为路径本身描述了两个资源之间的关系,并且很清楚您正在创建属于另一个资源的资源。
module Manufactorers
class CarsController < ApplicationController
before_action :set_manufacturer
# GET /manufacturers/acme/cars/new
def new
@car = @manufacturer.cars.new
end
# POST /manufacturers/acme/cars
def create
@car = @manufacturer.cars.new(car_params)
if @car.save
redirect_to @car
else
render :new
end
end
private
def set_manufacturer
# adapt this to your own slugging solution
@manufacturer = Manufacturer.find_by_slug_or_id(params[:id])
end
def car_params
params.require(:car)
.permit(:foo, :bar, :baz)
end
# ...
end
end
<%= form_with model: [@manufacturer, @car] do |form| %>
# ...
<% end %>
【讨论】:
以上是关于Rails 6 路线 - 如何添加自定义“新”路线?的主要内容,如果未能解决你的问题,请参考以下文章