Удаление "utf8=✓" из Rails 3 формы представления
у меня есть простая форма поиска в моих Rails 3 приложения:
<%= form_tag search_path, :method => "get" do %>
<%= text_field_tag :q, params[:q] %>
<%= submit_tag "search", :name => nil %>
<% end %>
когда пользователь нажимает кнопку Отправить, они попадают на URL:http://myapp.com/search?utf8=%E2%9C%93&q=foobar
(где %E2%9C%93
отображается в виде галочки:✓).
Я ничего не делаю с utf8
параметр, поэтому я хочу сохранить URL-адрес чистым, полностью удалив его. То есть, я хочу, чтобы пользователи попадали на URL:http://myapp.com/search?q=foobar вместо.
как мне это сделать?
8 ответов:
даже если вы ничего не делаете с параметром, рельсов. Это исправить некоторые проблемы в кодировке параметров IE. Yehuda имеет более подробную информацию здесь:
Как только вы поймете назначение рельсов UTF-8 param, и по какой-то причине вам все еще нужно удалить его, решение проще, чем вы думаете...просто не используйте
form_tag
помощник:<form action="<%= search_path %>" method="get"> <%= text_field_tag :q, params[:q] %> <%= submit_tag "search", :name => nil %> </form>
form_tag
в Rails 4.2 (и, вероятно, раньше) имеет ;если установлено значение false, скрытый вход с именем utf8 не выводится.
(то же самое, что https://stackoverflow.com/a/28201543/430695)
есть гем ( utf8_enforcer_workaround) для применения параметра utf8 только для браузеров, не соответствующих стандартам (или любой другой логики для этого). Это удобно, если вы не хотите беспокоить своих хорошо ведущих себя пользователей с помощью обходных путей IE.
Я сделал инициализатор, чтобы удалить параметр из GET-запросов. Это, очевидно, Хак.
Это
config/initializers/overrides.rb
:# Don't let Rails add a utf8=✓ param to GET forms. # See http://stackoverflow.com/questions/3222013/what-is-the-snowman-param-in-rails-3-forms-for for details. module ActionView::Helpers::FormTagHelper private def extra_tags_for_form_with_utf8_param_excluded_from_gets(html_options) old = extra_tags_for_form_without_utf8_param_excluded_from_gets(html_options) non_get = old.include?('"_method"') || old.include?('"'+request_forgery_protection_token.to_s+'"') if non_get old else old.sub(/<[^>]+name="utf8"[^>]+"✓"[^>]*>/, '').html_safe end end alias_method_chain :extra_tags_for_form, :utf8_param_excluded_from_gets end
В идеале Rails, вероятно, должен иметь настройку для этого или, по крайней мере, переписать extra_tags_for_form, чтобы было менее грязно исправлять.
использование before_action и перенаправление на другое действие работали для меня. Например, если вы ищете записи, настройте маршрут для поиска по коллекции.
resources :posts do collection do get 'search' end end
и сделать HTTP GET запрос для сообщений#index action.
<%= form_tag posts_path, method: :get do %> <%= search_field_tag :q, params[:q], placeholder: "Search posts" %> <%= submit_tag "Go" %> <% end %>
а затем в PostsController,
before_action :check_for_query, only: :index ... private def check_for_query redirect_to articles_search_url(q: params[:q]) if params[:q].present? end
и позвоните по почте.поиск в сообщениях#действие поиска и страница индекса рендеринга.
def search Post.search(params[:q]) render :index end
URL будет выглядеть как / сообщения / поиск?q=foo