围绕`mount`的`scope`无效?
(虽然这讨论了Blacklight引擎,但我相信这个问题实际上纯粹是关于Rails。)
我正在尝试为我的Blacklight应用添加国际化。 为此,我
-
将
config/routes.rb
所有内容config/routes.rb
到scope "(:locale)", locale: /en|ja/
,和 -
在
app/controllers/application_controller.rb
我添加了before_action :set_locale
并覆盖了default_url_options
正如Rails i18n指南所建议的那样。 大多数事情都有效,但有一点我无法弄清楚。
我的所有应用程序路由都已正确映射,例如http://www.example.com/en/catalog/12345
正确匹配(/:locale)/catalog/:id(.:format)
,并被路由到catalog#show
用{:id=>/[^\/]+(?=\.json|\.html|$|\/)/, :locale=>/en|ja/}
)显示。 所有Devise的url都很好。 一切正常……除了mount
Blacklight引擎。
显然,Blacklight引擎不听scope
。 rake routes
显示:
Routes for Blacklight::Engine: search_history GET /search_history(.:format) search_history#index ....
而不是(:locale)/search_history(.:format)
,我希望如此。
我修改了Blacklight模板,以便我得到一个语言选择器,用日语和英语指向当前页面,但是当我导航到search_history
, url_for
在面对:locale
参数时突然抛出。
为什么mount
会忽略scope
? 如何解决我的问题(引擎路由也响应:locale
)?
这是我默认的Blacklight生成的config/routes.rb
,用scope
修改:
Rails.application.routes.draw do scope "(:locale)", locale: /en|ja/ do mount Blacklight::Engine => '/' root to: "catalog#index" concern :searchable, Blacklight::Routes::Searchable.new resource :catalog, only: [:index], as: 'catalog', path: '/catalog', controller: 'catalog', id: /[^\/]+(?=\.json|\.html|$|\/)/ do concerns :searchable end devise_for :users concern :exportable, Blacklight::Routes::Exportable.new resources :solr_documents, only: [:show], path: '/catalog', controller: 'catalog', id: /[^\/]+(?=\.json|\.html|$|\/)/ do concerns :exportable end resources :bookmarks, id: /[^\/]+(?=\.json|\.html|$|\/)/ do concerns :exportable collection do delete 'clear' end end end end
tl; dr: scope
为我的所有路由添加前缀,但mount
除了路由。 为什么,以及如何解决?
似乎Rails确实忽略了引擎路由中的scope
,但我可以明确地为引擎添加范围:
Blacklight::Engine.routes.default_scope = { path: "(:locale)", locale: /en|ja/ } mount Blacklight::Engine => '/'
但是,这仍然无法解决我的问题(在link_to
继续使用引擎路由的参数 )。