(この記事ではBlacklightエンジンについて説明していますが、実際はRailsに関する質問のみとなります)`mount`の` scope`は効果がありませんか?
Blacklightアプリに国際化機能を追加しようとしています。 Rails i18n guideにより示唆されるようにそのためには、I
scope "(:locale)", locale: /en|ja/
にconfig/routes.rb
のすべてを包み、app/controllers/application_controller.rb
では私が
before_action :set_locale
とオーバーライドdefault_url_options
を追加しました。ほとんどのものは動作しますが、私が把握できなかったことが1つあります。
私のアプリケーションルートはすべて正しくマップされています。 http://www.example.com/en/catalog/12345
は(/:locale)/catalog/:id(.:format)
と正しく一致し、で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)
、私が望んでいるだろうと。
:locale
パラメータに直面したとき突然スロー私は日本語と英語の両方で現在のページを指す語チューを得るように、私はブラックライトテンプレートを変更したが、私はsearch_history
に移動したときに、url_for
。
なぜmount
は、scope
を無視しますか?問題を解決するにはどうすればいいですか(エンジンルートも:locale
に対応しています)?
は、ここに私のデフォルトはscope
で修飾し、config/routes.rb
をブラックライトで生成します:
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
によってルートを除きます。なぜ、どのように修正するのですか?