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?
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?
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>
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 )
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.
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"[^>]+"✓"[^>]*>/, '').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.
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
Essayez ceci dans votre ApplicationController:
def default_url_options(options={})
options.delete('utf8')
end
Je pense que nous devrions utiliser: enforce_utf8: false
dans form_tag.
Ex:
= form_tag search_path, method: :get, id: 'searchForm', enforce_utf8: false