2010-12-20 49 views
61

我有一個簡單的搜索在我的Rails 3應用程序:刪除「UTF8 =✓」從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清潔。也就是說,我希望用戶轉到URL:http://myapp.com/search?q=foobar

我該怎麼做?

+3

所以你做了什麼,最終?只是把它留在那裏? – Ayrton 2011-01-13 17:22:22

+3

shingara的答案在http://stackoverflow.com/questions/4104474/作品:只使用'

...
'而不是'<%= form_tag%> ... <% end %>'。請注意,只有在提交的內容永遠不會在數據庫中結束時,才應該這樣做,如http://stackoverflow.com/questions/3222013/上所述。 – AlexC 2011-02-11 00:47:15

+2

這是一個非常相關的問題,因爲我不想打擾用戶使用單個非標準兼容瀏覽器的解決方法。我只想爲我有幾個IE用戶使用「utf8 =✓」。 – Jarl 2012-07-04 08:34:42

回答

24

即使你沒有做任何與參數,Rails是。這是爲了解決IE參數編碼中的一些問題。耶胡達在這裏有更多的信息:

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

+1

有沒有一種方法可以通過在我的控制器中添加一些默認設置來改正IE參數編碼中的問題? – grautur 2010-12-20 17:52:39

+0

不是我所知道的。 – cdmwebs 2010-12-21 00:48:10

0

在你的ApplicationController試試這個:

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

這不起作用,因爲該方法必須返回一個散列並且現在可以返回例如'nil'。但改變它返回類似'{utf8:nil}'也沒有預期的效果。 – 2012-06-05 08:03:47

5

我做了一個初始值從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所以這是補丁少凌亂。

+0

剛剛更新了上面的代碼以使用Rails 3.2。 – 2012-06-05 09:00:12

10

有一些gem(utf8_enforcer_workaround)僅適用於不符合標準的瀏覽器(或任何其他邏輯)的utf8參數。如果您不想使用IE解決方法打擾行爲良好的用戶,這很方便。

38

一旦你瞭解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> 
+0

這幫助我配置submit_tag權限,謝謝! – Ikon 2013-10-01 12:16:50

+0

但'form_tag'幫手帶來了其他幾個功能! – 2018-02-05 14:12:20

1

使用before_action並重定向到另一個動作爲我工作。 例如,如果您正在搜索帖子,請設置用於搜索收藏的路線。

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

並對帖子進行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 

,並呼籲Post.search在帖子#搜索行動,並呈現索引頁。

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

的URL看起來像/職位/搜索?Q = foo的

+1

錯錯了錯 – Peter 2016-09-05 19:46:07