2013-09-23 43 views
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 

在路由表中有刚一个名为路由记录接触我们

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

您正在预先添加或添加在您面前实际上并没有取代任何东西。为什么不编辑原始路线?我不使用狂欢,所以我不确定这是否有可能。 – engineersmnky

+0

@engineersmnky重写并不意味着直接替换,而是改变相同控制器的路径,这将取得优先。我期待只有一条记录将新路径推到路由表的顶端。 –

+0

所以你想要有多个路径到相同的控制器和方法? – engineersmnky

回答

1

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

重复似乎很奇怪,但我没有看过如何疯狂处理这些事情。 为了避免这种情况,你可以重命名次要途径,如

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这将导致两者在同一个地方。然后创建一个方法来确定使用哪一个。

,或直接添加新的路线进入大礼包路由表的(可能是无效由于施普雷核心调用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总是具有参考第二条路线。

编辑 看来施普雷建立缺省路由,然后作为初始化代码中陈述后重新加载他们

# 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个值其持有到第二个在reload!。由于这个事实,我不确定你可以直接通过Spree做到这一点。

+0

感谢您的全面解答。我现在正在通过您的建议来调查问题。稍后让我们知道结果并可能接受你的答案。 –

+0

刚刚发现它是Spree中已知的一个bug [#11895](https://github.com/rails/rails/issues/11895)。 upvoted你的答案。谢谢。 –

1

使用

Spree::Core::Engine.routes.draw 

代替

Spree::Core::Engine.routes.prepend 

解决路由问题重复我。