从轨道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。
有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"[^>]+"✓"[^>]*>/, '').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