Удаление utf8 = ✓ из Rails 3 формы представления - PullRequest
66 голосов
/ 20 декабря 2010

У меня есть простая форма поиска в моем приложении 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 ]

39 голосов
/ 29 марта 2013

Как только вы поймете цель параметра Rails UTF-8 , и по какой-то причине вам все еще нужно его удалить, решение будет проще, чем вы думаете ... просто не используйте form_tag помощник:

<form action="<%= search_path %>" method="get">
  <%= text_field_tag :q, params[:q] %>
  <%= submit_tag "search", :name => nil %>
</form>
37 голосов
/ 28 января 2015

form_tag в Rails 4.2 (и, возможно, ранее) имеет опцию :enforce_utf8;

Если установлено значение false, скрытый ввод с именем utf8 не выводится.

(То же, что и https://stackoverflow.com/a/28201543/430695)

24 голосов
/ 20 декабря 2010

Даже если вы ничего не делаете с параметром, Rails - это.Это исправить некоторые проблемы в кодировании параметров IE.Yehuda имеет больше информации здесь:

Для чего нужен параметр _snowman в формах Ruby on Rails 3?

10 голосов
/ 02 августа 2012

Существует гем ( utf8_enforcer_workaround ) для применения параметра utf8 только для браузеров, не соответствующих стандартам (или любой другой логики для этого). Это удобно, если вы не хотите мешать своим хорошо работающим пользователям обходными путями IE.

3 голосов
/ 02 марта 2011

Я сделал инициализатор для удаления параметра из запросов GET.Это, очевидно, хак.

Это входит в config/initializers/overrides.rb:

# Don't let Rails add a utf8=✓ param to GET forms.
# See /2683663/dlya-chego-nuzhen-parametr-snowman-v-formah-ruby-on-rails-3 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"[^>]+"&#x2713;"[^>]*>/, '').html_safe
    end
  end

  alias_method_chain :extra_tags_for_form, :utf8_param_excluded_from_gets

end

В идеале, в Rails, вероятно, должна быть настройка для этого, или, по крайней мере, переписать extra_tags_for_form, чтобы его было менее грязно патчить.

1 голос
/ 21 ноября 2015

Использование before_action и перенаправление на другое действие работало для меня.Например, если вы ищете сообщения, настройте маршрут для поиска по коллекции.

resources :posts do
  collection do
    get 'search'
  end
end

и сделайте HTTP-запрос GET для сообщений # действие index.

<%= 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 в сообщениях # действие поиска и индексирования страницы индекса.

def search
   Post.search(params[:q])
   render :index
end

URL будет выглядеть как / posts / search? q = foo

0 голосов
/ 06 сентября 2018

Я думаю, что мы должны использовать: enforce_utf8: false в form_tag.

Пример:

= form_tag search_path, method: :get, id: 'searchForm', enforce_utf8: false
0 голосов
/ 20 декабря 2010

Попробуйте это в вашем ApplicationController:

def default_url_options(options={})
  options.delete('utf8')
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...