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

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

ただいまの
回答率

88.57%

検索機能がうまく機能しません

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 884

c.koki

score 14

indexで検索機能を実装中(この検索機能はtitle,などを検索するとその検索結果に引っかかったもののみ出るというものにしたいです)
検索機能でエラーが出てしまいます

No route matches {:action=>"show", :controller=>"information"}, missing required keys: [:id]

https://qiita.com/yusuko/items/cff4e46aeafbc3beecf2
このサイトを参考に検索機能を作っていたのですが、

index.html.erb

 <% content_for :header do %>
<section class="hero is-warning">
  <div class="hero-body">
    <div class="container">
      <h1 class="title">
        Browse the latest test information
      </h1>
    </div>
  </div>
</section>

<%= form_tag information_path, :method => 'get' do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
  </p>
<% end %>
<% end %>

<div class="instrument-index-grid pt4">
  <% @informations.each do |information| %>

    <div class="instrument border-light">
      <div class="instrument-thumb">
      <%= link_to image_tag(information.image_url(:thumb)), information %>

      <% if information.condition? %>
        <div class="condition">
          <span class="tag is-dark"><%= information.condition %></span>
        </div>
      <% end %>
      </div>


    <div class="pa3">

      <h3 class="fw7 f4 title"><%= link_to information.title, information %></h3>

      <p class="has-text-gray fg pt1">Post by <%#= information.user.name %></p>


      <% if information_author(information) %>
         <%= link_to 'Edit', edit_information_path(information), class: "button is-small" %>
         <%= link_to 'Delete', information, method: :delete, data: { confirm: "Are you sure ?" }, class: "button is-small" %>
      <% end %>

    </div>
  </div>
  <% end %>
</div>

information_controller

 class InformationController < ApplicationController
  before_action :set_information, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!, except: [:index, :show]
  # GET /information
  # GET /information.json
  def index
    @informations = Information.search(params[:search])
  end

  # GET /information/1
  # GET /information/1.json
  def show
  end

  # GET /information/new
  def new
    @information = current_user.informations.build
  end

  # GET /information/1/edit
  def edit
  end

  # POST /information
  # POST /information.json
  def create
    @information = current_user.informations.build(information_params)

    respond_to do |format|
      if @information.save
        format.html { redirect_to @information, notice: 'Information was successfully created.' }
        format.json { render :show, status: :created, location: @information }
      else
        format.html { render :new }
        format.json { render json: @information.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /information/1
  # PATCH/PUT /information/1.json
  def update
    respond_to do |format|
      if @information.update(information_params)
        format.html { redirect_to @information, notice: 'Information was successfully updated.' }
        format.json { render :show, status: :ok, location: @information }
      else
        format.html { render :edit }
        format.json { render json: @information.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /information/1
  # DELETE /information/1.json
  def destroy
    @information.destroy
    respond_to do |format|
      format.html { redirect_to information_index_url, notice: 'Information was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_information
      @information = Information.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def information_params
      params.require(:information).permit(:condition, :title, :description, :image)
    end
end


information.rb

def self.search(search) #ここでのself.はUser.を意味する
    if search
      where(['name LIKE ?', "%#{search}%"]) #検索とnameの部分一致を表示。User.は省略
    else
      all #全て表示。User.は省略
    end
  end


idがないとなっているのですが、どこでidを渡せばいいのかわかりません
showではidは渡してあります

回答お願いします!

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

細かいところは分からないので現在のエラーだけ・・
ルーティングの指定がRailsのデフォルトに則っていると仮定するとフォームに渡しているパスが間違っていると思います。

<%= form_tag information_path, :method => 'get' do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
  </p>
<% end %>

Railsのデフォルトのルーティングではindexには複数形の名前付きヘルパー、showには単数形の名前付きヘルパーが紐付けられます。

よって上記のinformation_pathは informationのshow(information/:id)にパラメーターを送信するフォームになっていて、idを指定していないため「missing required keys: [:id]」となります。

コントローラーを見ると検索時にパラメータを渡したいのはindexアクションのほうなので
informations_path とすれば良いと思います。

※informationが不加算名詞なのでヘルパー名が違うかもしれません
rails routesで information#indexの名前付きヘルパーを確認してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/14 17:28

    ありがとうございます、解決しました

    キャンセル

checkベストアンサー

0

route.rbにマッチしてないエラーが吐き出されていそうです。

なので、routes.rbで以下を追加して見てください。

resources :users do(userテーブルと勝手に解釈しました)
    ---->ここから
    collection do
        get :index
    end

ここでは、idを特定してしまっては検索の意味がないので、:id はいらないので、memberではなくcollection を採用しています。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/11 23:22

    違います。titleなどを検索すると出てくる仕組みにしたいです。
    https://gyazo.com/5172d3794ee223aac566f3623f461d8d
    現在こんな風になっているのでaiueoとしたらaiueo というtitleのもののみヒットするという仕組みにしたいです

    キャンセル

  • 2019/06/13 15:10

    タイトルの名前が入っているモデルは何でしょうか?
    多分、それがわかれば後はそのモデルに置き換えるだけだと思います。

    キャンセル

  • 2019/06/14 17:27

    うまくいきました、ありがとうございます

    キャンセル

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

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

関連した質問

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