【问题标题】:`scope` around `mount` ineffective?`scope` 围绕 `mount` 无效?
【发布时间】: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 引擎不听scoperake 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


    【解决方案1】:

    Rails 似乎确实在引擎路由中忽略了scope,但我可以明确地为引擎添加一个范围:

    Blacklight::Engine.routes.default_scope = { path: "(:locale)", locale: /en|ja/ }
    mount Blacklight::Engine => '/'
    

    但是,这仍然不能解决我的问题(继续link_to with parameters for an Engine route)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2012-11-21
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多