我在主页(root_path)上有一个搜索表,该搜索表也将结果返回到root_path。我正在使用Ruby I18n创建一个多语言站点,并且正在使用url parameters选项,以便这样指定语言:localhost /?locale = en
由于某种原因,提交搜索表单时,响应不是使用所选语言(它是默认语言),并且locale参数现在已从URL中删除。例如,使用localhost /?locale = ja提交将返回一个英文页面和一个localhost / URL(其他从参数搜索但没有语言环境的搜索)
我的应用程序的所有其他部分都正确保留了locale参数(例如link_to)。我的申请表中的其他表格在提交时也可以正确保存。
此表格与其他表格之间只有两个区别。
这是表格:
<%= form_with(url: root_path, local: true, method: :get) do |form| %>
(various fields)
<%= form.submit t(:submitsearch), name: nil %>
生成的html
<form action="/?locale=en" accept-charset="UTF-8" method="get">
<input type="submit" value="Search" data-disable-with="Search" />
application_controller
class ApplicationController < ActionController::Base
before_action :set_locale
def default_url_options
{ locale: I18n.locale }
end
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
end
但是请求的网址是:
http://localhost:3000/?utf8=✓&(other parameters - no locale)
这是我应用程序中的一个示例,该示例的行为符合预期
<%= form_with model: @equipment_type, local: true do |form| %>
(various fields)
<%= form.submit %>
已生成
的html<form action="/equipment_types/2?locale=en" accept-charset="UTF-8" method="post">
<input type="submit" name="commit" value="Update Equipment type" data-disable-with="Update Equipment type" />
我基本上需要搜索表单来保留用户选择的语言,但此刻它总是返回到后备状态(并且locale参数从URL中消失了)。表单操作似乎已正确生成(它具有?locale = en参数),但不在请求URL或响应中。
任何人都可以提出问题所在吗?
答案 0 :(得分:0)
因此,经过更多研究后,链接here暗示这是浏览器的默认行为,并且符合HTML规范。也就是说,表单操作中的任何查询字符串参数都将被完全替换。对于rails而言,这意味着即使您有一个带有GET操作的表单,即使rails将locale参数放在表单action中,它也不会被使用,并且您将丢失所选的语言环境(并恢复为默认设置)。
作为解决方案,您可以在表单中添加以下标记:
<%= hidden_field_tag "locale", params[:locale]%>
这会将参数重新添加到表单提交中。这并不完美,因为语言环境参数现在出现在UTF8后面(例如?utf8 =✓&locale = en),而在所有其他情况下,语言环境参数将首先出现。虽然这只是一个小问题。