【问题标题】:Rails routes: Order of nested scopesRails 路线:嵌套范围的顺序
【发布时间】:2020-06-26 13:08:57
【问题描述】:

所以我有一个更复杂的路线,我对两个嵌套范围的顺序有疑问。他们的顺序似乎颠倒了。我希望最内部的范围是操作之前 URL 的最后一段。但这是第一个。

routes.rb

namespace :customer do
  namespace :api do
    resources :products, only: [], param: :uid do
      scope module: 'products' do
        scope :buyer do
          post :set_to_waiting_list, to: 'buyers#set_to_waiting_list'
        end
      end
    end
  end
end

控制器:

module Customer
  module Api
    module Products
      class BuyersController < Customer::ApiController
        def set_to_waiting_list
          # do stuff
        end
      end
    end
  end
end

这在运行rake routes 时给了我这条路线:

customer_api_product_set_to_waiting_list POST /customer/api/buyer/products/:product_uid/set_to_waiting_list(.:format) customer/api/products/buyers#set_to_waiting_list

但我真正要查找的网址是:

POST /customer/api/products/:product_uid/buyer/set_to_waiting_list

原因是这会修改买家而不是产品。此外,买家是通过产品 uid(加上登录用户)获取的,因此这种 URL 格式更有意义。

我不太明白

【问题讨论】:

    标签: ruby-on-rails routes


    【解决方案1】:

    我仍然对这背后的逻辑感兴趣。但对于任何寻求解决方案的人,我只是解决了它:

    namespace :customer do
      namespace :api do
        resources :products, only: [], param: :uid do
          scope module: 'products' do
            post :set_to_waiting_list, path: 'buyer/set_to_waiting_list' to: 'buyers#set_to_waiting_list'
          end
        end
      end
    end
    

    【讨论】:

      【解决方案2】:

      您需要添加一个nested 块,以便作用域知道放置路径前缀的位置:

        namespace :customer do
          namespace :api do
            scope module: 'products' do
              resources :products, only: [], param: :uid do
                nested do
                  scope :buyer do
                    post :set_to_waiting_list, to: 'buyers#set_to_waiting_list'
                  end
                end
              end
            end
          end
        end
      

      nested 没有记录,所以我不确定你是否应该依赖它。作为替代方案,您可以添加 resource :buyers, only: [] {} 包装器:

        namespace :customer do
          namespace :api do
            scope module: 'products' do
              resources :products, only: [], param: :uid do
                resource :buyer, only: [] do
                  collection do
                    post :set_to_waiting_list
                  end
                end
              end
            end
          end
        end
      

      这两种情况的路由和控制器是一样的,但是 URL helper 是不同的:

      customer_api_product_set_to_waiting_list
      POST /customer/api/products/:product_uid/buyer/set_to_waiting_list(.:format)
      customer/api/products/buyers#set_to_waiting_list
      

      set_to_waiting_list_customer_api_product_buyer
      POST /customer/api/products/:product_uid/buyer/set_to_waiting_list(.:format)
      customer/api/products/buyers#set_to_waiting_list
      

      来源:https://github.com/rails/rails/issues/12626

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        • 1970-01-01
        • 2012-04-28
        • 2012-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多