🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

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

Q&A

解決済

1回答

16915閲覧

ActiveRecord::RecordNotFound in NotesController#showの意味

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

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

0グッド

3クリップ

投稿2016/03/24 12:09

編集2016/03/25 01:53

ActiveRecord::RecordNotFound in NotesController#showと表示されました。
Couldn't find Note with 'id'=showとさらに表示されました。
notes_controller.rbのprivateメソット以下のset_noteメソットがおかしいようで
def set_note
@note = Note.find(params[:id])←ここの部分がおかしい
end
と表示されました。
idがshowメソットに記されていないという認識で間違いないですよね?
SequelProを見ても、notesテーブルにきちんと投稿したカラムにidが書かれています。
何かコマンドを打ち忘れ、データが反映されていないのでしょうか?
回答お願いします。

routes.rbは
Rails.application.routes.draw do

devise_for :users
resources :users, only: [:index, :show, :edit, :update]
resources :notes, only: [:show, :create, :edit, :update, :destroy]

get'/top' => 'home#top'

get'/connection' => 'home#connection'
get'/notes/new' => 'notes#new'
post'/notes' =>'notes#create'
get'/notes' =>'notes#index'
get'/show' =>"notes#show"
get'/edit' =>'notes#edit'
patch'/notes/:id' =>"notes#update",as:'update_note'
delete'/notes/:id' =>"notes#destroy",as:'destroy_note'

post '/like/:note_id' => 'likes#like', as: 'like'
delete '/unlike/:note_id' => 'likes#unlike', as: 'unlike'

root 'home#top'
get'/about' => 'home#about'
end
のようになっています。
idはshowである、のように記述していないのでは?と思って困っています。
お願いいたします。

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

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

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

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

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

rifuch

2016/03/24 12:24

問題のページを呼び出している部分を見せてください。というか、そこをチェックすれば自ずとわかる気がしますが・・・
guest

回答1

0

ベストアンサー

画面がないので詳細にはわかりませんがroutingがおかしいです

route.rbの中で
notes/:id, to: 'notes#show'みたいに書いてあるとおもうですが、おそらくいま表示しているページは
/notes/showではないでしょうか

なので
/notes/showにアクセス
routing的には
/notes/:idなので
/notes/showはid=showを探しに行く
Note.find('show') => idがshowのやつを探しに行く。あれ、ないじゃん、
idがshowっていうデータないよーーーーで
Couldn't find Note with 'id'=show
がでているというわけです

なので実際にアクセスするべきページは
/notes/1とか/notes/23とかの数字が入るはずですこうすると
Noteテーブルからidが1とかのレコードを探してきてくれます!

投稿2016/03/24 16:02

MasakazuFukami

総合スコア1869

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

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

退会済みユーザー

退会済みユーザー

2016/03/25 01:54

なるほど!質問にコードを追加したのですが、idはshowである、のように記述していないのでは?と思って困っています。 教えてください、お願いします。
MasakazuFukami

2016/03/25 02:09

端的に答えを言うと > idはshowである、のように記述していない これは、 route.rbの resources :notes, only: [:show, :create, :edit, :update, :destroy] ここに含まれています。 railsが使えるところでrake routesする or /rails/info/routes (http://localhost:3000/rails/info/routes)してみると GET /notes/:id(.:format) notes#show がどこかにあると思います! また、routingの決まりを一応確認なのですが、 同じroutingがある場合、先に書いたroutingを参照します。 結局railsでurlから何かを取得する場合は routingで /xxxxxxx/:id(実際にアクセスするurl), to: 'xxxxxxx/show'( xxxxxx_controller,rbのshowメソッド) ってやります そうすると 上記urlにアクセスした瞬間にviewで必要なデータ等を準備するために xxxxxxx_controller.rbのdef showに行きます で@note = Note.find params[:id]で@noteを準備 viewで@noteを使ってレンダリング みたいになるわけです。 ちなみに質問者様が書いている get'/show' =>"notes#show" get'/edit' =>'notes#edit' これですと、 /showやeditにアクセスした時に本当は「画面に表示したり、編集したりしたい」のにcontrollerからすればurlに「どのid」のデータを取ってくるのかが入っていないため、何もすることができません。 なので正しいroutingは get '/notes/:id' => 'notes#show' get '/notes/:id/edit' => 'notes#edit' みたいになるわけです! とごちゃごちゃ書きましたが、 get '/notes/:id' => 'notes#show' get '/notes/:id/edit' => 'notes#edit' このようなroutingを全てやってくれるのが resources :notes, only: [:show, :create, :edit, :update, :destroy] これです。 長々書いてしまいましたすいません。 再度になりますが、質問者様の疑問の > idはshowである、のように記述していない これは、 route.rbの resources :notes, only: [:show, :create, :edit, :update, :destroy] が全てやってくれています!
退会済みユーザー

退会済みユーザー

2016/03/25 11:17

丁寧なコメントありがとうございます!!助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問