Ruby
Rails
haml
form_tag

【Rails】form_tagで2回目以降の検索をするとキーワードがURLに追加されていく問題

2回目以降の検索でキーワードがURLに追加されている!?

結論

× => = text_field
◯ => = text_field_tag

概要

【条件】

  • Rails 5.0.6
  • Ruby 2.3.1
  • haml

【機能】

  • 検索
  • submitボタンはなし(Enter)
  • 画面移管する

【課題】

  • 2回目以降の検索でURLにキーワードが追加され続ける。
  • 検索はできる。

下記のコードで実装していました。

views

header.html.haml
.col-md-1.search-box
  = form_tag( search_articles_path, method: :get ) do
    = image_tag 'glass.svg', { class: 'glass' }
    = text_field :key, params[:key], { placeholder: "検索する", class: "text" }

controller

articles_controller.rb
def search
  @article = Article.new
  @comment = Comment.new
  #検索機能
  @articles = Article.search(params[:key])
end

model

article.rb
def self.search(key)
  if key
    Article.where(['title LIKE ?', "%#{key}%"])
  else
    #ここは改善の余地あり
    Article.all
  end
end

これでは検索の度にURLに/articles/search?utf8=✓&key%5B%7B"ドラマ"%3D>"qiita"%7D%5D=確認の様にどんどん増え続けてしまって格好が悪いですよね。

これで解決!!

views(修正)

header.html.haml
.col-md-1.search-box
  = form_tag( search_articles_path, method: :get ) do
    = image_tag 'glass.svg', { class: 'glass' }
    = text_field_tag :key, params[:key], { placeholder: "検索する", class: "text" }

解説

1時間悩みましたが、結局はform_tagの中で= text_fieldでは無く= text_field_tagに変えるだけで解決しました。
hamlの書き方に慣れていなかった事やform_tagについて理解が浅かった事が原因でしょうね。

お願い

= text_field= text_field_tagの明確な違いをご存知の方はコメント欄で教えていただけるとありがたいです!!