Rails 5:搜索表单未保留语言环境网址参数

时间:2019-05-14 15:21:05

标签: ruby-on-rails-5

我在主页(root_path)上有一个搜索表,该搜索表也将结果返回到root_path。我正在使用Ruby I18n创建一个多语言站点,并且正在使用url parameters选项,以便这样指定语言:localhost /?locale = en

由于某种原因,提交搜索表单时,响应不是使用所选语言(它是默认语言),并且locale参数现在已从URL中删除。例如,使用localhost /?locale = ja提交将返回一个英文页面和一个localhost / URL(其他从参数搜索但没有语言环境的搜索)

我的应用程序的所有其他部分都正确保留了locale参数(例如link_to)。我的申请表中的其他表格在提交时也可以正确保存。

此表格与其他表格之间只有两个区别。

  1. 此表单使用method:get
  2. 此表单位于root_path

这是表格:

<%= 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或响应中。

任何人都可以提出问题所在吗?

1 个答案:

答案 0 :(得分:0)

因此,经过更多研究后,链接here暗示这是浏览器的默认行为,并且符合HTML规范。也就是说,表单操作中的任何查询字符串参数都将被完全替换。对于rails而言,这意味着即使您有一个带有GET操作的表单,即使rails将locale参数放在表单action中,它也不会被使用,并且您将丢失所选的语言环境(并恢复为默认设置)。

作为解决方案,您可以在表单中添加以下标记:

<%= hidden_field_tag "locale", params[:locale]%>

这会将参数重新添加到表单提交中。这并不完美,因为语言环境参数现在出现在UTF8后面(例如?utf8 =✓&locale = en),而在所有其他情况下,语言环境参数将首先出现。虽然这只是一个小问题。