我在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代替。
我该怎么做?
答案 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的隐藏输入。
答案 2 :(得分:24)
即使你没有对参数做任何事情,Rails也是。这是纠正IE的参数编码中的一些问题。 Yehuda在这里有更多信息:
答案 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"[^>]+"✓"[^>]*>/, '').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和网址中的名称