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

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

ただいまの
回答率

90.48%

  • Ruby

    9615questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    9026questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

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

解決済

回答 2

投稿

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

c.koki

score 2

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/09 17:41

    回答ありがとうございます
    routes.rbで
    resources :information do
    collection do
    get :index
    end
    end
    としてみましたが
    No route matches {:action=>"show", :controller=>"information"}, missing required keys: [:id]
    というエラーがまた出てしまいます。
    お手数ですが返信お願いします

    キャンセル

  • 2019/06/10 01:09 編集

    すみません、get: searchとしてください汗
    これで、information/searchというパスが生成されます。
    その後に、index.html.erbの検索フォームで
    ```
    <%= form_tag search_information_path, :method => 'get' do %>
    <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
    </p>
    <% end %>
    ```
    のように search_information_pathとrouteを変更すれば行けると思います。パス名が間違っていたらrails routesコマンドで確認してください。

    ご迷惑をお掛けしました...

    原因ですが、与える:idがなかったので、該当するルートのパスが見当たらなかったのが原因ですので、パスをroutes.rbで通してあげて、それに対応するようにビューのフォームのパスを変更すればいけます。

    キャンセル

  • 2019/06/10 13:12

    <%= form_tag search_information_path, :method => 'get' do %>でエラーが出たので以下のようにしてみました、そうすると検索を実行した時に
    The action 'search' could not be found for InformationControllerと出てしまいますコントローラーは
    def index
    @informations = Information.search(params[:search])
    endのようにしています。

    <%= form_tag search_information_index_path, :method => 'get' do %>
    <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
    </p>
    <% end %>
    お忙しいとは思いますが返信いただけると幸いです。

    キャンセル

  • 2019/06/10 14:26

    すみません、rails routesの結果を見せていただいてもよろしいでしょうか汗

    キャンセル

  • 2019/06/10 15:20

    ec2-user:~/environment/testinformation (master) $ rails routes
    Prefix Verb URI Pattern Controller#Action
    line_items GET /line_items(.:format) line_items#index
    POST /line_items(.:format) line_items#create
    new_line_item GET /line_items/new(.:format) line_items#new
    edit_line_item GET /line_items/:id/edit(.:format) line_items#edit
    line_item GET /line_items/:id(.:format) line_items#show
    PATCH /line_items/:id(.:format) line_items#update
    PUT /line_items/:id(.:format) line_items#update
    DELETE /line_items/:id(.:format) line_items#destroy
    carts GET /carts(.:format) carts#index
    POST /carts(.:format) carts#create
    new_cart GET /carts/new(.:format) carts#new
    edit_cart GET /carts/:id/edit(.:format) carts#edit
    cart GET /carts/:id(.:format) carts#show
    PATCH /carts/:id(.:format) carts#update
    PUT /carts/:id(.:format) carts#update
    DELETE /carts/:id(.:format) carts#destroy
    search_information_index GET /information/search(.:format) information#search
    information_index GET /information(.:format) information#index
    POST /information(.:format) information#create
    new_information GET /information/new(.:format) information#new
    edit_information GET /information/:id/edit(.:format) information#edit
    information GET /information/:id(.:format) information#show
    PATCH /information/:id(.:format) information#update
    PUT /information/:id(.:format) information#update
    DELETE /information/:id(.:format) information#destroy
    new_user_session GET /users/sign_in(.:format) devise/sessions#new
    user_session POST /users/sign_in(.:format) devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
    new_user_password GET /users/password/new(.:format) devise/passwords#new
    edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
    user_password PATCH /users/password(.:format) devise/passwords#update
    PUT /users/password(.:format) devise/passwords#update
    POST /users/password(.:format) devise/passwords#create
    cancel_user_registration GET /users/cancel(.:format) registrations#cancel
    new_user_registration GET /users/sign_up(.:format) registrations#new
    edit_user_registration GET /users/edit(.:format) registrations#edit
    user_registration PATCH /users(.:format) registrations#update
    PUT /users(.:format) registrations#update
    DELETE /users(.:format) registrations#destroy
    POST /users(.:format) registrations#create
    root GET / information#index
    rails_service_blob GET /rails/active_storage/blobs/:signed_id/*filename(.:format) active_storage/blobs#show
    rails_blob_representation GET /rails/active_storage/representations/:signed_blob_id/:variation_key/*filename(.:format) active_storage/representations#show
    rails_disk_service GET /rails/active_storage/disk/:encoded_key/*filename(.:format) active_storage/disk#show
    update_rails_disk_service PUT /rails/active_storage/disk/:encoded_token(.:format) active_storage/disk#update
    rails_direct_uploads POST /rails/active_storage/direct_uploads(.:format) active_storage/direct_uploads#create

    となっています

    キャンセル

  • 2019/06/10 15:46 編集

    Information.searchは初期値だとMember(null)になるので、
    def index
    @informations = []
    result = Information.search(params[:search])
    @informations = result
    end
    として見てくれませんでしょうか。多分、indexに飛んだ際にNULLになっているためっぽいです。

    また、よく見るとindexアクションで検索機能を実装しているため、
    routes.rbで
    resources :information do
    collection do
    get : search
    end
    end
    は削除してください汗
    これは、searchというパスを作成して、そのページに新しく検索機能を実装するときのやり方でした汗

    キャンセル

  • 2019/06/10 20:00

    返信ありがとうございます。
    <%= form_tag information_path, :method => 'get' do %>とすると
    No route matches {:action=>"show", :controller=>"information"}, missing required keys: [:id]となり、
    <%= form_tag search_information_path, :method => 'get' do %>とすると
    undefined local variable or method `search_information_path' for #<#<Class:0x00007f50c84c52a0>:0x00007f50c900dc48>
    となり、<%= form_tag search_information_index_path, :method => 'get' do %>としてもエラーが出てしまいます。
    どうすればいいでしょうか?
    def index
    @informations = []
    result = Information.search(params[:search])
    @informations = result
    endとしました

    キャンセル

  • 2019/06/10 20:41

    これは、定義されていない変数が定義されているということなので、search_information_pathはもう存在しないため、information_index_pathに変換すれば進むと思います。

    キャンセル

  • 2019/06/10 21:28

    そこのエラーはなくなったのですが
    <% @informations.each do |information| %>
    の部分でエラーが出てきて、
    SQLite3::SQLException: no such column: name: SELECT "information".* FROM "information" WHERE (name LIKE '%ai%')となってしまうので、

    modelの確認をしたのですが問題が無いように思います
    def self.search(search) #ここでのself.はUser.を意味する
    if search
    where(['name LIKE ?', "%#{search}%"]) #検索とnameの部分一致を表示。User.は省略
    else
    all #全て表示。User.は省略
    end
    end
    selfのところをInformationに変えても同じエラーでした

    キャンセル

  • 2019/06/11 00:36

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

    モデル部分のプログラムですが、where句を使いたい場合は、そのモデルを先に記載する必要がありますので、一例ですが
    def self.search(search)
    return Information.all unless search
    Information.where(['name LIKE ?', "%#{search}%"])
    end

    とする必要があるかなと思います。Informationは推測で勝手に記載したので、適宜直していただければと思います。

    キャンセル

  • 2019/06/11 08:11

    def self.search(search)
    return Information.all unless search
    Information.where(['name LIKE ?', "%#{search}%"])
    end

    としても <% @informations.each do |information| %>の部分で
    SQLite3::SQLException: no such column: name: SELECT "information".* FROM "information" WHERE (name LIKE '%aiu%')
    というエラーが検索してときに出てしまいます。

    キャンセル

  • 2019/06/11 09:57

    あ、そこのエラーだったんですね。
    そこは、最初は@informationが何もないっていないのにeachを回しているので、それに関するエラーです。ですので、@informationにデータが入っているかいないかでif文でフィルタをすれば行けると思います。

    キャンセル

  • 2019/06/11 10:43

    返信ありがとうございます
    <% if @informations.present? %>
    <% @informations.each do |information| %>としてみたのですが
    <% if @informations.present? %>の部分でSQLite3::SQLException: no such column: name: SELECT "information".* FROM "information" WHERE (name LIKE '%ai%')と出てしまいます。
    また検索ボタンを押した時にでるエラーなので@informationにデータは入っていると思うのですがどうすればいいでしょうか?

    キャンセル

  • 2019/06/11 11:59

    informationsテーブルにnameというカラムはあるのでしょうか?

    キャンセル

  • 2019/06/11 13:44

    sqlite> .schema information
    CREATE TABLE "information" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "condition" varchar, "title" varchar, "description" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL, "image" varchar, "user_id" integer);

    ないです、nameはuserのことだと思います

    キャンセル

  • 2019/06/11 16:45

    すみません、何を検索したいのかが分からないです。
    ユーザの名前を検索したいのでしょうか。

    それならば、informationsテーブルではなくusersテーブルを使用するように何箇所か書き換えれば行けると思います。あとはモデル側の問題だと思います。

    キャンセル

  • 2019/06/11 23:22

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

    キャンセル

  • 2019/06/13 15:10

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

    キャンセル

  • 2019/06/14 17:27

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

    キャンセル

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

  • Ruby

    9615questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    9026questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。