【问题标题】:`link_to` with parameters for an Engine route带有引擎路由参数的“link_to”
【发布时间】:2017-12-11 10:17:33
【问题描述】:

(虽然这里讨论的是 Blacklight 引擎,但我相信这个问题实际上纯粹是关于 Rails。)

scope around mount ineffective? 继续我的探索(tl;dr:使引擎路由遵循与应用程序路由相同的:locale 范围),在挖掘 Rails 源代码之后。

目前,我有这个设置:

# config/routes.rb
Rails.application.routes.draw do      
  Blacklight::Engine.routes.default_scope = { path: "(:locale)", locale: /en|ja/ }
  mount Blacklight::Engine => '/'

  scope "(:locale)", locale: /en|ja/ do
    # ...
  end
end

这使路由正常工作。但是,我有这个视图代码来生成当前页面的替代语言链接(由link_to the current page plus/merged with a param [duplicate] 指导):

<div id="languages_nav_popup" class="navbar-inverse">                                                                                                                                                          
  <% locales.each do |locale| %>
    <% next if locale == I18n.locale %>
    <%= link_to params.permit!.merge(locale: locale) do %>                                             
      <img src="<%= url_for "/img/flag/#{locale}.png" %>"/>                                            
    <% end %>
  <% end %>
</div>

当当前页面是引擎路由时,link_to 失败。这是由于actionpack中的这段代码:

# lib/action_dispatch/journey/formatter.rb
# Skip this route unless a name has been provided or it is a
# standard Rails route since we can't determine whether an options
# hash passed to url_for matches a Rack application or a redirect.
next unless name || route.dispatcher?

使用我上面使用的link_to options, &amp;block 语法,namenildispatcher?false 用于引擎路线。 (如果我通过强制插入名称通过检查,我会得到一个无意义的 URL,例如 .../assets?action=index&amp;controller=saved_searches&amp;locale=ja)。

我在这里变得绝望,几乎到了我认为处理这个问题的最佳方法是正则表达式的地步。这种暴行行得通:

<%= link_to request.base_url + request.original_fullpath.sub(%r{(?<=/)#{I18n.locale}}, locale.to_s) do %

有没有办法正确生成正确的网址?

【问题讨论】:

  • 你有没有找到一个好的解决方案?你有没有看到这个问题(和 PR 修复它):github.com/rails/rails/issues/33219 不过,如果你在 scope {} 中嵌入引擎,不确定行为是否相同。
  • @Andrei 我没有......不过我已经继续前进了,这个问题对我来说不再相关,所以我没有看到它。

标签: ruby-on-rails url-routing rails-engines blacklight


【解决方案1】:

另一个完全 hacky 的解决方案是将引擎路由复制到本地 routes.rb 并添加触发 gem 更新的警告以检查它们是否有更改。 :(

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-23
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多