web-dev-qa-db-ja.com

Rails 3つのフォーム送信から「utf8 =✓」を削除

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 代わりに。

どうすればいいですか?

66
grautur

パラメータを使用して何もしていなくても、Railsです。IEのパラメータエンコーディングの問題を修正するためです。Yehudaの詳細は次のとおりです。

Ruby on Rails 3 Forms for? の_snowmanパラメータとは

25
cdmwebs

Rails UTF-8 param の目的であり、何らかの理由でそれを削除する必要がある場合、解決策は思っているより簡単です... form_tagヘルパーを使用しないでください:

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

form_tag in Rails 4.2 (そしておそらくそれ以前)には:enforce_utf8オプション;

Falseに設定すると、utf8という名前の非表示の入力は出力されません。

https://stackoverflow.com/a/28201543/430695 と同じ)

37
Paul Annesley

規格に準拠していないブラウザ(またはそのための他のロジック)にのみutf8パラメータを適用するためのgem( tf8_enforcer_workaround )があります。これは、IE回避策を使用して、正常に動作するユーザーを煩わせたくない場合に便利です。

10
Jarl

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を書き直して、パッチが乱雑にならないようにします。

3
Henrik N

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のようになります

1
Ken Hibino

ApplicationControllerでこれを試してください。

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

使用すべきだと思う:enforce_utf8: false in form_tag。

例:

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