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 路线 - 如何添加自定义“新”路线?的主要内容,如果未能解决你的问题,请参考以下文章

升级到 Rails 6.1 后的 Rails 路线问题

Ruby on Rails 6 - 如何根据特定路线建模/隐藏视图?

高德地图如何自行规划路线

Rails 6 路线 - 简单嵌套路线的正确方法

rails 6中没有针对多个路线参数的路线匹配

Ruby on Rails - 如何为同一操作添加第二条路线?