路由覆盖双倍记录

时间:2013-09-23 17:34:22

标签: ruby-on-rails ruby ruby-on-rails-3 spree

我想覆盖Spree / Rails扩展的默认路径。

扩展名spree_contact_us以这种方式定义了config / routes.rb中的默认路由:

Spree::Core::Engine.routes.draw do
  resources :contacts,
    :controller => 'contact_us/contacts',
    :only       => [:new, :create]
  match 'contact-us' => 'contact_us/contacts#new', :as => :contact_us
end

在路线表中,名为 contact-us 的路线只有一个记录:

contact_us  /contact-us(.:format)  spree/contact_us/contacts#new

如果我将主应用程序的config / routes.rb中的以下覆盖传递给routes.prepend方法

Spree::Core::Engine.routes.prepend do
  match 'napiste-nam' => 'contact_us/contacts#new', :as => :contact_us
end

rake routes显示路由到新的命名路径两次,当传递给routes.append甚至三次时:

contact_us  /napiste-nam(.:format)  spree/contact_us/contacts#new
contact_us  /napiste-nam(.:format)  spree/contact_us/contacts#new

有人可以解释这种行为吗?

2 个答案:

答案 0 :(得分:1)

这里的问题是你将创建一个模糊的命名路由:contact_us,当contact_us_path引用时,它将返回路由中最后一个条目的路径,因为你正在重新定义它。

重复看起来确实很奇怪,但我没有看过spree如何处理这些事情。 为了避免这种情况,您可以重命名辅助路由,例如

Spree::Core::Engine.routes.append do
  match 'napiste-nam' => 'contact_us/contacts#new', :as => :contact_us_czech
end 

这应创建两条路线,您可以使用contact_us_pathcontact_us_czech_path两条路线,这两条路线都可以通往同一个地方。然后创建一个方法来确定使用哪个。

或者只是将新路由直接添加到spree路由表中(在Spree Core中可能无效,因为routes_reloader

match 'napiste-nam' => 'contact_us/contacts#new', :as => :contact_us
match 'contact_us' => 'contact_us/contacts#new', :as => :contact_us    

请记住,这意味着contact_us_path始终引用第二条路线。

修改 似乎Spree构建了默认路由,然后在初始化之后重新加载它们,如代码中所述

  # We need to reload the routes here due to how Spree sets them up.
  # The different facets of Spree (backend, frontend, etc.) append/prepend
  # routes to Core *after* Core has been loaded.
  #
  # So we wait until after initialization is complete to do one final reload.
  # This then makes the appended/prepended routes available to the application.
  config.after_initialize do
    Rails.application.routes_reloader.reload!
  end

我相信这会导致命名路由:contact_us被路由到它定义的路由,这意味着您将其定义为contact_us,然后将其重新定义为napiste-nam,因为变量可以有它只保留了reload!上的第二个值。由于这个事实,我不确定你可以通过Spree直接做到这一点。

答案 1 :(得分:1)

使用

Spree::Core::Engine.routes.draw

而不是

Spree::Core::Engine.routes.prepend

为我解决了路线重复问题。