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

时间:2010-12-20 07:55:36

标签: ruby-on-rails utf-8

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

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

当用户点击提交按钮时,他们会转到以下网址:http://myapp.com/search?utf8=%E2%9C%93&q=foobar (其中%E2%9C%93显示为复选标记:✓)。

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

我该怎么做?

9 个答案:

答案 0 :(得分:39)

一旦理解了the purpose of the Rails UTF-8 param,由于某种原因你还需要删除它,解决方案比你想象的更容易......只是不要使用form_tag帮助器:

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

答案 1 :(得分:37)

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

  

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

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

答案 2 :(得分:24)

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

What is the _snowman param in Ruby on Rails 3 forms for?

答案 3 :(得分:10)

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

答案 4 :(得分:3)

我创建了一个初始化程序,用于从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,以便修补它的麻烦。

答案 5 :(得分:1)

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

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

并对帖子进行HTTP GET请求#index action。

<%= 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

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

答案 6 :(得分:0)

在ApplicationController中尝试:

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

答案 7 :(得分:0)

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

例如:

= form_tag search_path, method: :get, id: 'searchForm', enforce_utf8: false

答案 8 :(得分:0)

function dialog() {  
    var data = '<input type="button" value="Create A Copy" onclick="google.script.run.withSuccessHandler(openfile).copyDoc();"><script>function openfile(url) {window.open(url);}</script>';
    var html = HtmlService.createHtmlOutput(data);  
    SpreadsheetApp.getUi().showModalDialog(html, 'New Form - Click here');
} 
function copyDoc() { 
    var drive=DriveApp.getFileById('fileid'); 
    var timestamp = new Date().toISOString().replace("T", " ").split(".")[0];  
    var ss = SpreadsheetApp.getActiveSpreadsheet();  
    var file = DriveApp.getFileById(ss.getId());  
    var fileName = ('filename - '+timestamp); 
    drive.makeCopy(fileName); 
}

<%= form_tag(search_path,method: :get ,enforce_utf8: false) do %> <%= text_field_tag :name, nil,class: "landing_text",:placeholder =>'Chips and burgers' %> <%= submit_tag 'SEARCH', class: "search_btn",:name=>nil%> <% end %> enforce_utf8: false将删除utf8和网址中的名称