web-dev-qa-db-fra.com

Suppression de "utf8 = ✓" dans les soumissions de formulaire Rails 3

J'ai un formulaire de recherche simple dans mon application Rails 3:

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

Lorsque l'utilisateur clique sur le bouton d'envoi, il est redirigé vers l'URL: http://myapp.com/search?utf8=%E2%9C%93&q=foobar (Où %E2%9C%93 est affiché comme coche : ✓).

Je ne fais rien avec le paramètre utf8, donc je veux garder l'URL propre en la supprimant entièrement. C’est-à-dire que je veux que les utilisateurs soient dirigés vers l’URL: http://myapp.com/search?q=foobar .

Comment puis-je faire cela?

64
grautur

Même si vous ne faites rien avec le paramètre, Rails l'est. Il s'agit de corriger certains problèmes liés au codage de paramètres d'IE. Yehuda a plus d'informations ici: 

À quoi sert le paramètre _snowman dans les formulaires Ruby on Rails 3?

24
cdmwebs

Une fois que vous avez compris l'objectif du paramètre de Rails UTF-8 et que, pour une raison quelconque, vous devez toujours le supprimer, la solution est plus simple que vous ne le pensez ... n'utilisez pas l'aide form_tag:

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

form_tag dans Rails 4.2 (et probablement plus tôt) a une option :enforce_utf8;

Si la valeur est false, une entrée masquée avec le nom utf8 n'est pas sortie.

(Identique à https://stackoverflow.com/a/28201543/430695 )

34
Paul Annesley

Il existe une gemme ( utf8_enforcer_workaround ) pour l’application du paramètre utf8 uniquement pour les navigateurs non conformes aux normes (ou toute autre logique pour cela). C'est pratique si vous ne voulez pas déranger vos utilisateurs bien comportants avec des solutions de contournement IE.

10
Jarl

J'ai fait un initializer pour enlever le param de demandes GET. C'est évidemment un bidouillage.

Cela va dans 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

Idéalement, Rails devrait probablement avoir un paramètre pour cela, ou au moins réécrire extra_tags_for_form pour que le correctif soit moins complexe.

4
Henrik N

Utiliser before_action et rediriger vers une autre action a fonctionné pour moi ... par exemple, si vous recherchez des publications, configurez un itinéraire pour une recherche sur une collection.

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

et faites une requête HTTP GET pour les actions # index.

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

puis dans 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

et appelez Post.search dans posts # action de recherche et rendez la page d'index.

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

L'URL ressemblera à/posts/search? Q = foo

1
Ken Hibino

Essayez ceci dans votre ApplicationController:

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

Je pense que nous devrions utiliser: enforce_utf8: false dans form_tag.

Ex:

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