gpt4 book ai didi

ruby-on-rails - `link_to` 带有引擎路由的参数

转载 作者:行者123 更新时间:2023-12-03 14:58:33 26 4
gpt4 key购买 nike

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

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

目前,我有这个设置:

# 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

这使路由正常工作。但是,我有这个 View 代码来生成当前页面的替代语言链接(由 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对于发动机路线。 (如果我通过强制插入名称来通过该检查,我会得到一个无意义的 URL,如 .../assets?action=index&controller=saved_searches&locale=ja )。

我在这里变得绝望,几乎到了我认为处理这个问题的最佳方法是正则表达式的地步。这种暴行有效:
<%= link_to request.base_url + request.original_fullpath.sub(%r{(?<=/)#{I18n.locale}}, locale.to_s) do %

有没有办法正确生成正确的 URL?

最佳答案

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

关于ruby-on-rails - `link_to` 带有引擎路由的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44965303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com