从轨道3删除“utf8 =✓”提交

我在我的Rails 3应用程序中有一个简单的search表单:

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

当用户点击提交button时,他们被带到URL http://myapp.com/search?utf8=%E2%9C%93&q=foobar (其中%E2%9C%93被显示为复选标记)。

我没有做任何与utf8参数,所以我想通过完全删除它的URL保持清洁。 也就是说,我希望用户转到URL http://myapp.com/search?q=foobar 。

我如何做到这一点?

即使你没有做任何的参数,Rails是。 这是为了纠正IE的参数编码中的一些问题。 耶胡达在这里有更多的信息:

Ruby on Rails 3表单中的_snowman参数是什么?

一旦理解了Rails UTF-8参数的用途 ,出于某种原因您仍然需要将其删除,解决scheme比您想象的要简单…只是不要使用form_tag帮助程序:

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

Rails 4.2中的form_tag (可能更早)有一个:enforce_utf8选项;

如果设置为false,则不输出名称为utf8的隐藏input。

(与https://stackoverflow.com/a/28201543/430695相同);

有gem( utf8_enforcer_workaround )只适用于不符合标准的浏览器(或任何其他逻辑)的utf8参数。 如果您不想使用IE解决方法打扰您的行为良好的用户,这很方便。

我做了一个初始化程序来从GET请求中删除参数。 这显然是一个黑客。

这进入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 

理想情况下,Rails可能应该有一个设置,或至less重写extra_tags_for_form,所以它不那么乱。

使用before_action并redirect到另一个行动为我工作。 例如,如果您正在searchpost,请设置一个用于search的path。

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

并对post#索引动作进行HTTP GET请求。

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

然后在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 

并在posts#search action和render index页面中调用Post.search。

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

该URL看起来像/ posts / search?q = foo

在你的ApplicationController中试试这个:

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