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


67

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

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

当用户单击“提交”按钮时,他们将进入URL:http%E2%9C%93 ://myapp.com/search?utf8=%E2%9C%93&q = foob​​ar (其中显示为复选标记:✓)。

我对该utf8参数不做任何事情,因此我想通过完全删除URL来保持URL干净。也就是说,我希望用户使用该URL:http//myapp.com/search?q = foob​​ar。

我该怎么做呢?


3
所以你最终做了什么?只是留在那里?

3
shingara在stackoverflow.com/questions/4104474上的答案有效:仅使用<form>...</form>而不是<%= form_tag %>...<% end %>。请注意,仅当提交的内容永远不会出现在数据库中时,才应该这样做,如stackoverflow.com/questions/3222013所述
AlexC 2011年

2
这是一个非常相关的问题,因为我不想为单个不符合标准的浏览器打扰用户。我只希望我拥有的少数IE用户使用此“ utf8 =✓”。
Jarl

2
看到我的答案。的:enforce_utf8选项form_tag
保罗·安妮斯利

如果您想utf8使用Javascript / jQuery序列化忽略参数,则可以使用以下代码:$("form#my_form :input[name!='utf8']").serialize()。它将忽略utf8序列化参数中的键/值对
MrYoshiji

Answers:



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帮助器还具有其他一些功能!
奥古斯丁·里丁格


10

有gem(utf8_enforcer_workaround)用于仅将utf8参数应用于不符合标准的浏览器(或为此目的而使用的任何其他逻辑)。如果您不想让表现良好的用户使用IE解决方法,这将非常方便。


3

我做了一个初始化程序,以从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可能应该对此进行设置,或者至少重写extra_tags_for_form,以使其修补起来不那么混乱。


1

在您的ApplicationController中尝试以下操作:

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

这是行不通的,因为该方法必须返回哈希值,并且现在可能会返回eg nil。但是,将其更改为返回类似内容{ utf8: nil }也不会达到预期效果。
Henrik N

1

使用before_action并重定向到另一个动作对我来说很有效。例如,如果您要搜索帖子,请设置一条路径来搜索收藏集。

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

并发出posts#index操作的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操作和呈现索引页面中调用Post.search。

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

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


1

我认为我们应该enforce_utf8: false在form_tag中使用:

例如:

= form_tag search_path, method: :get, id: 'searchForm', enforce_utf8: false
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.