我想覆盖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
有人可以解释这种行为吗?
答案 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_path
和contact_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
为我解决了路线重复问题。