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%93q=foobar (where %E2%9C%93
getsチェックマークとして表示:✓)。
utf8
パラメーターを使用して何もしていないので、URLを完全に削除して、URLをクリーンに保ちたいと思います。つまり、ユーザーにURLを取得してほしい: http://myapp.com/search?q=foobar 代わりに。
どうすればいいですか?
パラメータを使用して何もしていなくても、Railsです。IEのパラメータエンコーディングの問題を修正するためです。Yehudaの詳細は次のとおりです。
Ruby on Rails 3 Forms for? の_snowmanパラメータとは
Rails UTF-8 param の目的であり、何らかの理由でそれを削除する必要がある場合、解決策は思っているより簡単です... form_tag
ヘルパーを使用しないでください:
<form action="<%= search_path %>" method="get">
<%= text_field_tag :q, params[:q] %>
<%= submit_tag "search", :name => nil %>
</form>
form_tag
in Rails 4.2 (そしておそらくそれ以前)には:enforce_utf8
オプション;
Falseに設定すると、utf8という名前の非表示の入力は出力されません。
規格に準拠していないブラウザ(またはそのための他のロジック)にのみutf8パラメータを適用するためのgem( tf8_enforcer_workaround )があります。これは、IE回避策を使用して、正常に動作するユーザーを煩わせたくない場合に便利です。
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"[^>]+"✓"[^>]*>/, '').html_safe
end
end
alias_method_chain :extra_tags_for_form, :utf8_param_excluded_from_gets
end
理想的には、Railsにはおそらくこれを設定する必要があります。または、少なくともextra_tags_for_formを書き直して、パッチが乱雑にならないようにします。
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
URLは/ posts/search?q = fooのようになります
ApplicationControllerでこれを試してください。
def default_url_options(options={})
options.delete('utf8')
end
使用すべきだと思う:enforce_utf8: false
in form_tag。
例:
= form_tag search_path, method: :get, id: 'searchForm', enforce_utf8: false