0

我想覆盖 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

在 routes 表中,只有一条名为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

任何人都可以解释这种行为吗?

4

2 回答 2

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 

这应该会创建 2 条您可以使用的路线,它们都contact_us_pathcontact_us_czech_path通向同一个地方。然后创建一个方法来确定使用哪个。

或者只是将新路由直接添加到 spree 路由表中(可能由于routes_reloaderSpree Core 中的调用而无效。

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并且由于变量只能具有 1 个值,因此它保留在 .on 上的第二个值reload!。由于这个事实,我不确定您是否可以直接通过 Spree 执行此操作。

于 2013-09-23T20:13:11.810 回答
1

使用

Spree::Core::Engine.routes.draw

代替

Spree::Core::Engine.routes.prepend

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

于 2013-10-18T18:54:10.683 回答