Rails 5: Форма поиска не сохраняет параметр URL локали - PullRequest
0 голосов
/ 14 мая 2019

У меня есть поисковая форма на моей домашней странице (root_path), которая также возвращает результаты в root_path.Я делаю многоязычный сайт с использованием Ruby I18n и использую опцию параметров url, чтобы язык был задан примерно так: localhost /? Locale = en

По какой-то причине, при отправке формы поиска, ответне на выбранном языке (это на языке по умолчанию), а параметр locale теперь отсутствует в URL.Например, отправка с помощью localhost /? Locale = ja вернется с английской страницей и URL-адресом localhost / (другой поиск по параметрам, но без локали)

Все остальные части моего приложения правильно сохраняют параметр локали (например, link_to).Другие формы в моем заявлении также сохраняют его правильно при отправке

Есть только два различия, которые я вижу между этой формой и другими.

  1. Эта форма использует метод: get
  2. Эта форма находится в корневом каталоге_путей

Вот форма:

<%= 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

Однако URL, которыйзапрашивается:

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" />

Мне в основном нужноФорма поиска, чтобы сохранить выбранный пользователем язык, но в данный момент он всегда возвращается к запасному (и параметр локали исчезает из URL).Кажется, что действие формы генерируется правильно (оно имеет параметр? Locale = en), но его нет в URL-адресе или ответе на запрос.

Кто-нибудь может подсказать, в чем может быть проблема?

1 Ответ

0 голосов
/ 15 мая 2019

Итак, после небольшого исследования ссылка здесь предполагает, что это поведение браузеров по умолчанию и что оно соответствует спецификациям HTML. То есть любые параметры строки запроса в действии формы будут полностью заменены. Для rails это означает, что если у вас есть форма с действием GET, даже если rails помещает параметр locale в действие формы, он не будет использоваться, и вы потеряете выбранную локаль (и вернетесь к настройкам по умолчанию).

В качестве решения вы можете добавить в форму следующий тег:

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

Что добавит параметр обратно в отправку формы. Это не идеально, потому что параметр локали теперь появляется после UTF8 (например,? Utf8 = ✓ & locale = en), тогда как во всех других случаях параметр локали будет появляться первым. Хотя это только второстепенный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...