`link_to`包含引擎路由的参数

时间:2017-07-07 07:45:44

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

(虽然这讨论了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, &block语法,namenil;并且dispatcher?对于引擎路线是false。 (如果我通过强制插入名称来通过该检查,我会得到一个像.../assets?action=index&controller=saved_searches&locale=ja这样的无意义的网址。

我在这里绝望,几乎到了我认为处理这个问题的最佳方法是regexp。这种暴行有效:

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

无法正确生成正确的网址吗?

1 个答案:

答案 0 :(得分:0)

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