【发布时间】:2017-07-06 09:24:06
【问题描述】:
(虽然这里讨论的是 Blacklight 引擎,但我相信这个问题实际上纯粹是关于 Rails。)
我正在尝试将国际化添加到我的 Blacklight 应用程序中。为此,我
将
config/routes.rb中的所有内容包装到scope "(:locale)", locale: /en|ja/中,并且在
app/controllers/application_controller.rb中我添加了before_action :set_locale并覆盖了default_url_options
按照Rails i18n guide 的建议。大多数事情都有效,但有一件事我无法弄清楚。
我的所有应用程序路由都已正确映射,例如http://www.example.com/en/catalog/12345 与(/:locale)/catalog/:id(.:format) 正确匹配,并通过{:id=>/[^\/]+(?=\.json|\.html|$|\/)/, :locale=>/en|ja/} 路由到catalog#show)。 Devise 的所有 URL 都很好。一切正常...除了mount-ed 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 的路由除外。为什么以及如何解决?
【问题讨论】:
标签: ruby-on-rails internationalization url-routing blacklight