Ответ 1
Даже если вы ничего не делаете с параметром, Rails. Он исправляет некоторые проблемы в кодировке параметров IE. Иегуда имеет больше информации здесь:
Что представляет собой параметр _snowman в Ruby on 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.
Как мне это сделать?
Даже если вы ничего не делаете с параметром, Rails. Он исправляет некоторые проблемы в кодировке параметров IE. Иегуда имеет больше информации здесь:
Что представляет собой параметр _snowman в Ruby on Rails 3 для?
Как только вы понимаете цель Rails 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 (и, возможно, ранее) имеет параметр :enforce_utf8
;
Если установлено значение false, скрытый ввод с именем utf8 не выводится.
(То же, что fooobar.com/questions/91129/...)
Существует gem (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
и вызовите Post.search в сообщениях # search action и render index page.
def search
Post.search(params[:q])
render :index
end
URL-адрес будет выглядеть как /posts/search? q = foo
Попробуйте это в приложении ApplicationController:
def default_url_options(options={})
options.delete('utf8')
end
Я думаю, что мы должны использовать: enforce_utf8: false
в form_tag.
Пример:
= form_tag search_path, method: :get, id: 'searchForm', enforce_utf8: false
<%= form_tag(search_path,method: :get ,enforce_utf8: false) do %>
<%= text_field_tag :name, nil,class: "landing_text",:placeholder =>'Chips and burgers' %>
<%= submit_tag 'SEARCH', class: "search_btn",:name=>nil%>
<% end %>
enforce_utf8: false
и name=>nil
удалит utf8 и имя в URL