题 从Rails 3表单提交中删除“utf8 =✓”


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

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

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

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

我该怎么做呢?


63
2017-12-20 07:55


起源


那么你最终做了什么?把它留在那里? - Ayrton
shingara的回答 stackoverflow.com/questions/4104474 工作:只是使用 <form>...</form> 而不是 <%= form_tag %>...<% end %>。请注意,只有在提交的内容永远不会在数据库中结束时才应该这样做,如上所述 stackoverflow.com/questions/3222013 。 - AlexC
这是一个非常相关的问题,因为我不想打扰我的用户使用一个符合非标准的浏览器的变通方法。对于我拥有的少数IE用户,我只想要这个“utf8 =✓”。 - Jarl
看到 我的答案 回覆。该 :enforce_utf8 选项 form_tag。 - Paul Annesley
如果你想忽略了 utf8 使用Javascript / jQuery序列化的param,您可以使用以下命令: $("form#my_form :input[name!='utf8']").serialize()。它会忽略 utf8 序列化参数中的键/值对 - MrYoshiji


答案:


即使你没有对参数做任何事情,Rails也是。这是纠正IE的参数编码中的一些问题。 Yehuda在这里有更多信息:

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


24
2017-12-20 10:39



有没有办法通过在我的控制器中添加一些默认值来改变IE的参数编码中的那些问题? - grautur
不是我知道的。 - cdmwebs


一旦你明白了 Rails UTF-8参数的目的,由于某种原因你仍然需要删除它,解决方案比你想象的更容易...只是不要使用 form_tag 帮手:

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

39
2018-03-29 02:50



这有助于我正确配置submit_tag,谢谢! - Ikon
但是 form_tag 帮手带来了其他几个功能! - Augustin Riedinger


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

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

(与...一样 https://stackoverflow.com/a/28201543/430695


31
2018-01-28 20:17





有宝石(utf8_enforcer_workaround)仅适用于符合非标准的浏览器(或为此目的的任何其他逻辑)的utf8参数。如果您不想通过IE解决方法来打扰表现良好的用户,这很方便。


10
2017-08-02 08:45





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

这进入了 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应该有一个设置,或者至少重写extra_tags_for_form,这样修补就不那么麻烦了。


4
2018-03-01 23:03



刚刚更新了上面的代码以使用Rails 3.2。 - Henrik N


使用before_action并重定向到另一个动作对我有用。 例如,如果要搜索帖子,请设置搜索集合的路径。

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

并为帖子#index action做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

并在帖子#search action和render index page中调用Post.search。

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

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


1
2017-11-21 18:36



错误的错误 - Peter


在ApplicationController中尝试这个:

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

0
2017-12-20 10:06



这不起作用,因为该方法必须返回一个哈希值,现在可以返回例如 nil。但改变它返回类似的东西 { utf8: nil } 也没有预期的效果。 - Henrik N