it-swarm.dev

Removendo "utf8 = ✓" dos sub-formulários do Rails 3

Eu tenho um formulário de pesquisa simples no meu aplicativo Rails 3:

<%= form_tag search_path, :method => "get" do %>
  <%= text_field_tag :q, params[:q] %>
  <%= submit_tag "search", :name => nil %>
<% end %>

Quando o usuário clica no botão de envio, ele é levado para a URL: http://myapp.com/search?utf8=%E2%9C%93&q=foobar (Onde %E2%9C%93 é exibido como uma marca de verificação: ✓).

Não estou fazendo nada com o parâmetro utf8, portanto, quero manter o URL limpo, removendo-o completamente. Ou seja, quero que os usuários sejam levados para a URL: http://myapp.com/search?q=foobar em vez disso.

Como eu faço isso?

64
grautur

Mesmo que você não esteja fazendo nada com o parâmetro, o Rails é. É para corrigir alguns problemas na codificação de parâmetros do IE. Yehuda tem mais informações aqui: 

O que é o _snowman param em Ruby on Rails 3 forms for?

24
cdmwebs

Uma vez que você entendeu o objetivo do parâmetro Rails UTF-8 , e por alguma razão você ainda precisa removê-lo, a solução é mais fácil do que você pensa ... apenas não use o auxiliar form_tag:

<form action="<%= search_path %>" method="get">
  <%= text_field_tag :q, params[:q] %>
  <%= submit_tag "search", :name => nil %>
</form>
39
Andrew

form_tag no Rails 4.2 (e provavelmente anterior) tem uma opção :enforce_utf8;

Se configurado como false, uma entrada oculta com o nome utf8 não será produzida.

(O mesmo que https://stackoverflow.com/a/28201543/430695 )

34
Paul Annesley

Existe gem ( utf8_enforcer_workaround ) para aplicar o utf8 param somente para navegadores que não cumpram os padrões (ou qualquer outra lógica para esse propósito). Isso é útil se você não quiser incomodar seus usuários com bom comportamento com IE soluções alternativas.

10
Jarl

Eu fiz um inicializador para remover o param de solicitações GET. É obviamente um truque.

Isso vai em 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"[^>]+"&#x2713;"[^>]*>/, '').html_safe
    end
  end

  alias_method_chain :extra_tags_for_form, :utf8_param_excluded_from_gets

end

Idealmente, o Rails provavelmente deveria ter uma configuração para isso, ou pelo menos reescrever o extra_tags_for_form, então é menos confuso fazer o patch.

4
Henrik N

Usando before_action e redirecionando para outra ação funcionou para mim. Por exemplo, se você estiver procurando por posts, configure uma rota para pesquisa na coleção.

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

e faça uma requisição HTTP GET para posts # action index.

<%= form_tag posts_path, method: :get do %>
  <%= search_field_tag :q, params[:q], placeholder: "Search posts" %>
  <%= submit_tag "Go" %>
<% end %>

e depois no 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

e chame Post.search nas postagens # ação de busca e renderizar página de índice.

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

O URL será parecido com/posts/search? Q = foo

1
Ken Hibino

Tente isso no seu ApplicationController:

def default_url_options(options={})
  options.delete('utf8')
end
0
Jan

Acho que devemos usar: enforce_utf8: false em form_tag.

Ex:

= form_tag search_path, method: :get, id: 'searchForm', enforce_utf8: false
0
Akiko