从Rails 3表单提交中删除"utf8=✓"

68

我在我的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
我该怎么做?

3
你最终做了什么?只是把它放在那里吗? - user191766
3
shingara在https://dev59.com/nm855IYBdhLWcg3w3IXr上的回答可行:只需使用`<form>...</form>而不是<%= form_tag %>...<% end %>`。请注意,只有在所提交的内容永远不会进入您的数据库时,才应这样做,如https://dev59.com/tXA75IYBdhLWcg3wkZ-A中所解释的那样。 - AlexC
2
这是一个非常相关的问题,因为我不想让我的用户为了一个不符合标准的浏览器而烦恼。我只想让这个"utf8=✓"对于我拥有的少数IE用户生效。 - Jarl
2
请参考我的回答,了解 form_tag:enforce_utf8 选项。链接:https://dev59.com/7W855IYBdhLWcg3wMBLV#28201592 - Paul Annesley
如果你想在使用Javascript/jQuery序列化时忽略utf8参数,可以使用以下代码:$("form#my_form :input[name!='utf8']").serialize()。这将忽略序列化参数中的utf8键/值对。 - MrYoshiji
8个回答

41

39

一旦您理解了Rails UTF-8参数的作用,如果出现需要删除它的情况,解决方案比您想象的要简单...只需不使用form_tag助手即可:

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

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

26

1
有没有一种方法可以通过在我的控制器或其他地方添加一些默认值来纠正IE参数编码中的这些问题呢? - grautur

10

这里有一个宝石(utf8_enforcer_workaround),可以只对不遵循标准的浏览器(或任何其他逻辑)应用utf8参数。如果你不想为IE解决方案而麻烦表现良好的用户,则此功能非常有用。


3

我制作了一个初始化程序来从GET请求中删除参数。这显然是一种hack。

将其放置在config/initializers/overrides.rb中:

# Don't let Rails add a utf8=✓ param to GET forms.
# See https://dev59.com/tXA75IYBdhLWcg3wkZ-A 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函数以便更容易修补。

1
我认为我们应该在form_tag中使用:enforce_utf8: false
例如:
= form_tag search_path, method: :get, id: 'searchForm', enforce_utf8: false

1
使用 before_action 并重定向到另一个操作对我很有帮助。 例如,如果您正在搜索帖子,请在集合上设置搜索路由。
resources :posts do
  collection do
    get 'search'
  end
end

进行HTTP GET请求以获取posts#index操作。保留HTML格式,不解释。
<%= 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操作中调用Post.search并呈现索引页面。
def search
   Post.search(params[:q])
   render :index
end

URL将会是/posts/search?q=foo



1

在您的 ApplicationController 中尝试这个:

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

这样做不起作用,因为该方法必须返回哈希值,现在可能会返回nil。但是将其更改为返回类似于{ utf8: nil }的内容也没有预期的效果。 - Henrik N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接