質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.50%

railsのform_forで指定したurlにリダイレクトしない

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,688

score 41

目標・実現したいこと

ruby(ruby on rails)で、全てのページに表示するグローバルナビ(ヘッダー)に検索窓を設置して、
投稿したものを検索できるようにしたいと考えています。

例えば、投稿一覧(http://localhost:3000/item_stocks)とは関係ない
ユーザー設定のページ(http://localhost:3000/users/edit)で表示されている
グローバルナビで検索を行った場合・・・ 検索ボタンを押すと投稿一覧のページに飛んで、検索結果が表示されるようにしたいのです

問題点

しかし、
検索ボタンを押しても検索結果を表示する投稿一覧のページにリダイレクトせず、検索したページのままで困っています
エラー表示もありません。
URLを見ると、検索用のパラメータは作成されているみたいです。
http://localhost:3000/users/edit?utf8=%E2%9C%93&item_search_form%5Ball_search%5D=%E6%A4%9C%E7%B4%A2%E3%83%86%E3%82%B9%E3%83%88&button=

現状のコード

現状のコードを説明すると・・・
フォームオブジェクトに検索機能を書きました。検索対象は、投稿(ItemStock)モデルだけとしています。
/app/forms/item_search_form.rb

class ItemSearchForm
  include ActiveModel::Model

  attr_accessor  :all_search

  def search
    rel = ItemStock.where(['item_name LIKE ?', "%#{all_search}%"])
  end
end


全ての画面から行えるようにしたかったので、
applicationコントローラーに、検索用のパラメータと検索情報の受け渡しについて書きました。
app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  before_action :set_grobal_search
  #グローバルナビにある検索の振る舞い
  def set_grobal_search
    @search_form5 = ItemSearchForm.new(globalnavi_all_search_params)
    @search_item2 = @search_form5.search
  end

  protected

  #グローバルナビからアイテム検索用
  def globalnavi_all_search_params
    params.fetch(:order_search_form, {}).permit(:all_search)
  end

end

layouts/viewの_header.html.erbには、
リダイレクト先のurlにitem_stockのindexページ(item_stocks_path)を指定してform_forを書きました。

/app/views/layouts/_header.html.erb(グローバルナビの共通テンプレート)

<nav class="navbar navbar-fixed-top">
  <div class="container">
    <div class="navbar-header">
      <button class="navbar-toggle collapsed" data-toggle="collapse" data-target="#mobile_menu_header1">menu <i class='glyphicon glyphicon-align-justify'></i></button>
       <%= link_to "サービス名ロゴ", root_path, id: "logo" %>
    </div>

    <div class="collapse navbar-collapse" id="mobile_menu_header1"><!-- ハンバーガーメニュー格納 -->
      <form class="navbar-form navbar-left" role="search">
        <span  class="form-group">
<!--問題の検索フォーム部分、item_stocks_pathにリダイレクトしてくれない -->
      <% @search_form = ItemSearchForm.new unless @search_form %>
      <%= form_for @search_form5, url: item_stocks_path, method: :get do |f| %>
      <%= f.text_field :all_search, class: 'form-control', placeholder: 'アイテム名検索テスト中' %>
      <%= button_tag sanitize('<i class="glyphicon glyphicon-search"></i>'), :type => "submit",:class =>"btn  btn-default" %>
      <% end %>
        </span>
      </form>

    </div><!-- ここまで格納機能に格納する内容 -->
  </div>
</nav>

おそらくビューに問題の原因があり、リダイレクト先のURLを指定してあげれば大丈夫だと思ったのですが、ダメみたいです。
もし解決方法を知っているならば、教えて頂ければ幸いです。

追記

ビュー(app/views/layouts/_header.html.erb)に2つの検索フォームを作成して試したところ、
1つ目はリダイレクトせず、
2つ目はリダイレクトに成功しました。

      <form class="navbar-form navbar-left" role="search"><!-- 左側に検索窓(入力フォーム)を設置 -->
        <span  class="form-group">
      <!--一つ目の検索フォーム、なぜかリダイレクトには失敗 -->
          <%= form_for @search_form5, url: item_stocks_path, method: :get do |f| %>
          <% end %>
          <!--2つ目の検索フォーム、リダイレクトに成功 -->
          <% @search_form = ItemSearchForm.new unless @search_form %>
          <%= form_for @search_form5, url: item_stocks_path, method: :get do |f| %>
          <%= f.text_field :all_search, class: 'form-control', placeholder: 'アイテム名検索テスト中' %>
          <%= button_tag sanitize('<i class="glyphicon glyphicon-search"></i>'), :type => "submit",:class =>"btn  btn-default" %><!-- 検索アイコンボタンを表示 -->
          <% end %>
        </span>
      </form>

その一方で、ヘッダーと同じく全体に表示するフッター部分テンプレートでは以下のコードでうまくいっています。
app/views/layouts/_footer.html.erb

<footer class="footer">
  <nav>
    <ul>
      <li><%= link_to "About",   '#' %></li>
    </ul>
  </nav>
  <!-- 検索フォーム-->
  <%= form_for @search_form5, url: item_stocks_path, method: :get do |f| %>
  <%= f.text_field :all_search, class: 'form-control', placeholder: 'アイテム名検索テスト中' %>
  <%= button_tag sanitize('<i class="glyphicon glyphicon-search"></i>'), :type => "submit",:class =>"btn  btn-default" %>
  <% end %>
</footer>

一応ヘッダーがこの状態でも、当初の目標を満たすことはできるのですが、
フッターではうまくいくのに、
ヘッダーで2つ検索フォームをつくらないとうまくいかない原因が不可解です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る