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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

Ruby on Rails

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

1回答

625閲覧

良く分からないアクションが反応してエラーになる

divclass123

総合スコア35

Ruby

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

Ruby on Rails

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2020/12/09 14:10

編集2020/12/09 14:17

前提・実現したいこと

gemはransackで
検索機能を実装していて、検索して、検索結果処理をして、検索結果のビューを表示したいのですが、検索ボタンを押した後にdrinks#search_drinkを反応させたいのですが
何故かdrinks#showが反応して、

Couldn't find Drink with 'id'=searchdrink

といったエラーが起きてます

もっと詳しくいうと、カテゴリ検索的なことがしたくて、
active hashを用いてカテゴリ選択をしていて、
イメージ説明
このようにコーヒーの濃さで検索できるようにしたいです

そもそもactive hashを用いたカテゴリだと検索ができないのでしょうか?

 とにかくsearch_drinkアクションを反応させたいです

発生している問題・エラーメッセージ

ActiveRecord::RecordNotFound in DrinksController#show Couldn't find Drink with 'id'=searchdrink Extracted source (around line #12): def show @drink = Drink.find(params[:id]) ここがハイライトされてます @user = @drink.user end Rails.root: /Users/soichirohara/coffee_passport Application Trace | Framework Trace | Full Trace app/controllers/drinks_controller.rb:12:in `show'

考えられる原因としてはroutes.rbの記述がうまくいっていない
検索フォームの記述が間違ってる

該当のソースコード

drinks/index.html.erb

ruby

1<h1> 2 商品検索 3</h1> 4<%= search_form_for @p,url: drinks_searchdrink_path do |f| %> 5<%# search_form_for @p(検索オブジェクトを渡すことで 6 検索フォームを生成しています)%> 7 <%= f.collection_select :name_eq,@drink_body,:name,:name,include_blank: '---'%> 8 <%# 第一引数: 検索したいカラム名 9 2: 配列データを指定(今回はdrinkの配列) 10 いわば検索したいカラムのデータ元 11 3: 表示する際に参照するDBのカラム名 12 4: 実際に表示されるカラム名 13 5 何も選択してない時に表示される内容%> 14 <br> 15 <%= f.submit '検索'%> 16<% end %>

routes.rb

ruby

1Rails.application.routes.draw do 2 root to: 'drinks#index' 3 get '/login', to: 'sessions#new' 4 post '/login', to: 'sessions#create' 5 delete '/logout', to: 'sessions#destroy' 6 resources :users do 7 member do 8 get :following,:followers 9 # memberメソッドを使うと 10 # ユーザーidが含まれてるURlを扱うようになる 11 end 12 end 13 resources :drinks, only: [:index,:new,:show,:create,:destroy] do 14 collection do 15 get 'search' 16 end 17 18 19 resources :trades,only: [:index,:new,:create] 20 end 21 post '/drinks/:id/trades/new', to: 'trades#create' 22 get '/drinks/searchdrink', to: 'drinks#search_drink' 23 resources :relationships, only: [:create,:destroy] 24end

drinks_controller

ruby

1 2before_action :searched_drink_object,only:[:index,:search_drink] 3 4 # GET drinks/search_drinks 5 def search_drink 6 @results = @p.result.includes(:body) 7 # 作った検索オブジェクト@pに対して.result 8 # とすると検索結果を取得できる 9 # 検索条件に該当した商品が@pに格納されているので、 10 # その格納されている値を表示する役割があります 11 end 12 13 private 14 def drink_params 15 params.require(:drink_tag).permit(:name,:price,:explain,:image,:tag_name,:region_id,:body_id,:acidity_id,:processing_id).merge(user_id: current_user.id) 16 end 17 18 def searched_drink_object 19 @p = Drink.ransack(params[:q]) 20 # キー(:q)を使ってDrinksテーブルから商品情報を探しています 21 # @pという名前の検索オブジェクトを生成 22 end 23end 24

body.rb

ruby

1class Body < ActiveHash::Base 2 3 self.data = [ 4 { id: 1, name: '--' }, 5 { id: 2, name: 'LIGHT(軽い)' }, 6 { id: 3, name: 'MEDIUM(ほどよい)' }, 7 { id: 4, name: 'FULL(しっかり)' } 8 ] 9end

ログ

Started GET "/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSWhObUpuZEhSMWRUVTNNR3huWTJwNGNqaHpaV0kyT1dWaU5HTnZZUVk2QmtWVU9oQmthWE53YjNOcGRHbHZia2tpVldsdWJHbHVaVHNnWm1sc1pXNWhiV1U5SW1sdFp5MXdZWE56Y0c5eWRDMHdOQzB4TG1wd1p5STdJR1pwYkdWdVlXMWxLajFWVkVZdE9DY25hVzFuTFhCaGMzTndiM0owTFRBMExURXVhbkJuQmpzR1ZEb1JZMjl1ZEdWdWRGOTBlWEJsU1NJUGFXMWhaMlV2YW5CbFp3WTdCbFE9IiwiZXhwIjoiMjAyMC0xMi0wOVQxMzoxMzozOC44NDVaIiwicHVyIjoiYmxvYl9rZXkifX0=--725748959cb475c186bdf86c23e9cfad96b9903d/img-passport-04-1.jpg?content_type=image%2Fjpeg&disposition=inline%3B+filename%3D%22img-passport-04-1.jpg%22%3B+filename%2A%3DUTF-8%27%27img-passport-04-1.jpg" for ::1 at 2020-12-09 22:09:46 +0900 Processing by ActiveStorage::DiskController#show as JPEG Parameters: {"content_type"=>"image/jpeg", "disposition"=>"inline; filename=\"img-passport-04-1.jpg\"; filename*=UTF-8''img-passport-04-1.jpg", "encoded_key"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSWhObUpuZEhSMWRUVTNNR3huWTJwNGNqaHpaV0kyT1dWaU5HTnZZUVk2QmtWVU9oQmthWE53YjNOcGRHbHZia2tpVldsdWJHbHVaVHNnWm1sc1pXNWhiV1U5SW1sdFp5MXdZWE56Y0c5eWRDMHdOQzB4TG1wd1p5STdJR1pwYkdWdVlXMWxLajFWVkVZdE9DY25hVzFuTFhCaGMzTndiM0owTFRBMExURXVhbkJuQmpzR1ZEb1JZMjl1ZEdWdWRGOTBlWEJsU1NJUGFXMWhaMlV2YW5CbFp3WTdCbFE9IiwiZXhwIjoiMjAyMC0xMi0wOVQxMzoxMzozOC44NDVaIiwicHVyIjoiYmxvYl9rZXkifX0=--725748959cb475c186bdf86c23e9cfad96b9903d", "filename"=>"img-passport-04-1"} Completed 304 Not Modified in 1ms (ActiveRecord: 0.0ms | Allocations: 362) Started GET "/rails/active_storage/disk/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSWhPV0p2YW1jMmQyODBibXB4YmpKd2VIWjNhSEp2TXpZeWJXVm1hUVk2QmtWVU9oQmthWE53YjNOcGRHbHZia2tpQWNacGJteHBibVU3SUdacGJHVnVZVzFsUFNJbE0wWWxNMFlsTTBZbE0wWWxNMFlsTTBZbE0wWWxNMFlsTTBZZ01qQXlNQzB4TWkwd05pQXhOQzR3Tnk0ME5TNXdibWNpT3lCbWFXeGxibUZ0WlNvOVZWUkdMVGduSnlWRk15VTRNaVZDT1NWRk15VTRNaVZCUmlWRk15VTRNeVZCUVNWRk15VTRNeVZDUXlWRk15VTRNeVZDTXlWRk15VTRNaVZDTnlWRk15VTRNeVZCTnlWRk15VTRNeVU0TXlWRk15VTRNeVU0T0NVeU1ESXdNakF0TVRJdE1EWWxNakF4TkM0d055NDBOUzV3Ym1jR093WlVPaEZqYjI1MFpXNTBYM1I1Y0dWSklnNXBiV0ZuWlM5d2JtY0dPd1pVIiwiZXhwIjoiMjAyMC0xMi0wOVQxMzoxMzozOC43ODZaIiwicHVyIjoiYmxvYl9rZXkifX0=--7aaa5870ab16a67f06b3cf82f3184d68c9ba09b3/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202020-12-06%2014.07.45.png?content_type=image%2Fpng&disposition=inline%3B+filename%3D%22%253F%253F%253F%253F%253F%253F%253F%253F%253F+2020-12-06+14.07.45.png%22%3B+filename%2A%3DUTF-8%27%27%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%25202020-12-06%252014.07.45.png" for ::1 at 2020-12-09 22:09:46 +0900 Processing by ActiveStorage::DiskController#show as PNG Parameters: {"content_type"=>"image/png", "disposition"=>"inline; filename=\"%3F%3F%3F%3F%3F%3F%3F%3F%3F 2020-12-06 14.07.45.png\"; filename*=UTF-8''%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202020-12-06%2014.07.45.png", "encoded_key"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSWhPV0p2YW1jMmQyODBibXB4YmpKd2VIWjNhSEp2TXpZeWJXVm1hUVk2QmtWVU9oQmthWE53YjNOcGRHbHZia2tpQWNacGJteHBibVU3SUdacGJHVnVZVzFsUFNJbE0wWWxNMFlsTTBZbE0wWWxNMFlsTTBZbE0wWWxNMFlsTTBZZ01qQXlNQzB4TWkwd05pQXhOQzR3Tnk0ME5TNXdibWNpT3lCbWFXeGxibUZ0WlNvOVZWUkdMVGduSnlWRk15VTRNaVZDT1NWRk15VTRNaVZCUmlWRk15VTRNeVZCUVNWRk15VTRNeVZDUXlWRk15VTRNeVZDTXlWRk15VTRNaVZDTnlWRk15VTRNeVZCTnlWRk15VTRNeVU0TXlWRk15VTRNeVU0T0NVeU1ESXdNakF0TVRJdE1EWWxNakF4TkM0d055NDBOUzV3Ym1jR093WlVPaEZqYjI1MFpXNTBYM1I1Y0dWSklnNXBiV0ZuWlM5d2JtY0dPd1pVIiwiZXhwIjoiMjAyMC0xMi0wOVQxMzoxMzozOC43ODZaIiwicHVyIjoiYmxvYl9rZXkifX0=--7aaa5870ab16a67f06b3cf82f3184d68c9ba09b3", "filename"=>"スクリーンショット 2020-12-06 14.07.45"} Completed 304 Not Modified in 2ms (ActiveRecord: 0.0ms | Allocations: 355) Started GET "/drinks/searchdrink?q%5Bname_eq%5D=LIGHT%28%E8%BB%BD%E3%81%84%29&commit=%E6%A4%9C%E7%B4%A2" for ::1 at 2020-12-09 22:09:49 +0900 Processing by DrinksController#show as HTML Parameters: {"q"=>{"name_eq"=>"LIGHT(軽い)"}, "commit"=>"検索", "id"=>"searchdrink"} Drink Load (0.3ms) SELECT `drinks`.* FROM `drinks` WHERE `drinks`.`id` = NULL LIMIT 1 ↳ app/controllers/drinks_controller.rb:12:in `show' Completed 404 Not Found in 3ms (ActiveRecord: 0.3ms | Allocations: 1485)

と、showアクションが反応してしまいます

パラメーターは

{"q" => {"name_eq" => "MEDIUM(表される)"}、 "commit" => "検索"、 "id" => "searchdrink"}

 でした

試したこと

rails routesを実行して

ruby

1 drinks_searchdrink GET /drinks/searchdrink(.:format) drinks#search_drink

があることを確認できました

これをurl指定してると思うので、何故drinks#showが反応してしまうのか、
search_drinkアクションを反応させるにはどうしたらいいか
ご教授いただけると幸いです

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Railsのルーティングは、ルーティングファイルの「上からの記載順に」マッチします。このため、たとえばresources :photosというルーティングがget 'photos/poll'よりも前の行にあれば、resources行のshowアクションがget行の記述よりも優先されますので、get行のルーティングは有効になりません。これを修正するには、get行をresources行 よりも上 の行に移動してください。これにより、get行がマッチするようになります。

Rails のルーティング

下記のルーティングでは上に書いてあるdrinks#show が優先されています。

resources :drinks, only: [:index,:new,:show,:create,:destroy] get '/drinks/searchdrink', to: 'drinks#search_drink'

投稿2020/12/09 14:20

neko_daisuki

総合スコア2090

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

divclass123

2020/12/09 14:25

解決できました、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問