Eliminando “utf8 = ✓” de las presentaciones de formularios de Rails 3

Tengo un formulario de búsqueda simple en mi aplicación Rails 3:

 "get" do %>   nil %>  

Cuando el usuario pulsa el botón Enviar, se dirige a la URL: http://myapp.com/search?utf8=%E2%9C%93&q=foobar (donde %E2%9C%93 se muestra como una marca de verificación: ✓ )

No estoy haciendo nada con el parámetro utf8 , por lo que quiero mantener la URL limpia eliminándola por completo. Es decir, quiero que los usuarios sean llevados a la URL: http://myapp.com/search?q=foobar en su lugar.

¿Cómo hago esto?

Aunque no está haciendo nada con el parámetro, Rails sí lo está. Es para corregir algunos problemas en la encoding de parámetros de IE. Yehuda tiene más información aquí:

¿Para qué sirve el _snowman param en las formas de Ruby on Rails 3?

Una vez que comprenda el propósito del parámetro Rails UTF-8 , y por alguna razón aún necesita eliminarlo, la solución es más fácil de lo que cree … simplemente no use el form_tag helper:

 
< %= text_field_tag :q, params[:q] %> < %= submit_tag "search", :name => nil %>

form_tag en Rails 4.2 (y probablemente antes) tiene una opción :enforce_utf8 ;

Si se establece en falso, no se genera una entrada oculta con el nombre utf8.

(Lo mismo que https://stackoverflow.com/a/28201543/430695 )

Hay gem ( utf8_enforcer_workaround ) para aplicar el param utf8 solo para navegadores que no cumplen con los estándares (o cualquier otra lógica para ese motivo). Esto es útil si no desea molestar a los usuarios que se comportan bien con las soluciones alternativas de IE.

Hice un inicializador para eliminar el parámetro de las solicitudes GET. Es obviamente un truco.

Esto va en 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 

Idealmente, Rails probablemente debería tener una configuración para esto, o al menos volver a escribir extra_tags_for_form para que sea menos complicado parchear.

Usar before_action y redirigir a otra acción funcionó para mí. Por ejemplo, si está buscando publicaciones, configure una ruta para buscar en la colección.

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

y hacer la solicitud HTTP GET para la acción del índice # de publicaciones.

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

y luego en 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 

y llama a Post.search en las publicaciones # acción de búsqueda y página de índice de procesamiento.

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

La URL se verá como / posts / search? Q = foo

Pruebe esto en su ApplicationController:

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

Creo que deberíamos usar: enforce_utf8: false en form_tag.

Ex:

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