68 votes

Suppression de "utf8=" dans les soumissions de formulaires 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 appuie sur le bouton d'envoi, il est dirigé vers l'URL : http://myapp.com/search?utf8=%E2%9C%93&q=foobar (où %E2%9C%93 s'affiche sous la forme d'une coche : ).

Je ne fais rien avec le utf8 Je veux donc garder l'URL propre en le supprimant entièrement. En d'autres termes, je veux que les utilisateurs soient dirigés vers l'URL : http://myapp.com/search?q=foobar à la place.

Comment dois-je m'y prendre ?

3 votes

Qu'avez-vous fait finalement ? Vous l'avez laissé là ?

3 votes

Réponse de shingara sur stackoverflow.com/questions/4104474 fonctionne : il suffit d'utiliser <form>...</form> plutôt que <%= form_tag %>...<% end %> . Notez que vous ne devez procéder de la sorte que si le contenu soumis ne peut jamais se retrouver dans votre base de données, comme expliqué à la page stackoverflow.com/questions/3222013 .

2 votes

C'est une question très pertinente car je ne veux pas ennuyer mes utilisateurs avec des solutions de contournement pour un seul navigateur non conforme aux normes. Je ne veux ce "utf8=" que pour les quelques utilisateurs d'IE que je possède.

39voto

Andrew Points 30079

Une fois que vous aurez compris le but du paramètre UTF-8 de Rails et que, pour une raison quelconque, vous devez quand même le supprimer, la solution est plus simple que vous ne le pensez... il suffit de ne pas utiliser la fonction form_tag aide :

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

0 votes

Cela m'a aidé à configurer correctement le submit_tag, merci !

0 votes

Mais le form_tag helper apporte plusieurs autres fonctionnalités !

26voto

cdmwebs Points 651

Même si vous ne faites rien avec le paramètre, Rails le fait. Il s'agit de corriger certains problèmes dans l'encodage des paramètres d'IE. Yehuda a plus d'informations ici :

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

1 votes

Existe-t-il un moyen de corriger ces problèmes d'encodage des paramètres d'IE en ajoutant une valeur par défaut dans mon contrôleur ou autre ?

10voto

Jarl Points 1243

Il existe une gemme ( utf8_enforcing_workaround ) pour appliquer le paramètre utf8 uniquement aux navigateurs ne respectant pas les normes (ou toute autre logique dans ce sens). C'est pratique si vous ne voulez pas embêter vos utilisateurs qui se comportent bien avec les solutions de contournement d'IE.

3voto

Henrik N Points 4447

J'ai créé un initialisateur pour supprimer le paramètre des requêtes GET. C'est évidemment un hack.

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 qu'il soit moins difficile à corriger.

1voto

Jan Points 712

Essayez ceci dans votre ApplicationController :

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

0 votes

Cela ne fonctionne pas, car cette méthode doit renvoyer un hachage et peut maintenant renvoyer, par exemple, les éléments suivants nil . Mais en le changeant pour qu'il renvoie quelque chose comme { utf8: nil } n'a pas non plus l'effet escompté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X