【问题标题】:Rails 6 routes - how to add custom "new" route?Rails 6 路线 - 如何添加自定义“新”路线?
【发布时间】: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 的错误。

【问题讨论】:

    标签: ruby-on-rails ruby routes


    【解决方案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 %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-16
        • 1970-01-01
        • 1970-01-01
        • 2019-06-29
        • 2011-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多