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

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

詳細はこちら
Ruby on Rails

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

Q&A

2回答

2649閲覧

find(params[:id])でidを受け取ることができません。

RyukiAbe

総合スコア4

Ruby on Rails

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

0グッド

0クリップ

投稿2019/12/12 16:07

前提・実現したいこと

Railsでブログを作っています。ブログのジャンルの名前の編集を行えるようにしたいです。
ここに質問の内容を詳しく書いてください。
ブログのジャンルを追加することはできるのですが編集画面に行き変更内容を送信しようとすると以下のようなエラー画面になってしまいます。おそらくeditアクションのparams[:id]で正しく値を受け取れていないと考えています。

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

```ここに言語を入力 エラーメッセージ ActiveRecord::RecordNotFound in BloggenresController#edit Couldn't find Bloggenre with 'id'=index Extracted source (around line #17): Rails.root: /home/ec2-user/environment/baskeblogs Application Trace | Framework Trace | Full Trace app/controllers/bloggenres_controller.rb:17:in `edit' Request Parameters: {"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"XD3nHM41lmA3yBjq1wAxcdbRCxjHtKXm3eDE7MYQENpSqBjgcyDMpdnhKqGGtvEKELGI4oGDjsJh945nyWKH5A==", "bloggenre"=>{"name"=>"ドリブル", "memo"=>"強さ"}, "commit"=>"送信", "actiion"=>"edit", "id"=>"index"} Toggle session dump Toggle env dump Response Headers:

'''

該当のソースコード

rails

ファイル名 bloggenres.cotoroller.rb class BloggenresController < ApplicationController layout 'bloggenres' def index @data = Bloggenre.all end def add @bloggenre = Bloggenre.new if request.post? then @bloggenre = Bloggenre.create bloggenre_params redirect_to '/bloggenres' end end def edit @bloggenre = Bloggenre.find(params[:id]) if request.patch? then @bloggenre.update bloggenre_params redirect_to '/bloggenres' end end private def bloggenre_params params.require(:bloggenre).permit(:name, :memo) end end
ファイル名 index.html.erb <h1>Bloggenres#index</h1> <p>※ジャンル・データの一覧</p> <table> <tr> <th>Id</th><th>name</th><th>memo</th><th></th> </tr> <% @data.each do |obj| %> <tr> <td><%= obj.id %></td> <td><%= obj.name %></td> <td><%= obj.memo %></td> <td><a href="/bloggenres/<%= obj.id %>">Edit</a></td> </tr> <% end %> </table> <p><a href="/bloggenres/add">新規作成>></a></p>
ファイル名 edit.html.erb <h1>Bloggenres#edit</h1> <p>※「<%= @bloggenre.name %>」ジャンルの編集</p> <% if @bloggenre.errors.any? %> <ul> <% @bloggenre.errors.full_messages.each do |err| %> <li><%= err %></li> <% end %> </ul> <% end %> <table> <%= form_for(@bloggenre, url:{controller:'bloggenres', actiion:'edit' }) do |form| %> <tr><th>Title</th> <td><%= form.text_field :name %></td></tr> <tr><th>Subtitle</th> <td><%= form.text_field :memo %></td></tr> <tr><th></th> <td><%= form.submit "送信" %></td></tr> <% end %> </table>
ファイル名 routes.rb Rails.application.routes.draw do root to: 'blogs#index' get 'blogs/index' get 'blogs', to: 'blogs#index' get 'blogs/:page', to: 'blogs#index' get 'blogs/genre/:id', to: 'blogs#genre' get 'blogs/genre/:id/:page', to: 'blogs#genre' get 'blogs/show/:id', to: 'blogs#show' get 'blogposts/index' get 'blogposts', to: 'blogposts#index' get 'blogposts/delete/:id', to: 'blogposts#delete' post 'blogposts/delete', to: 'blogposts#delete' post 'blogposts/delete/:id', to: 'blogposts#delete' get 'blogposts/add' post 'blogposts/add' get 'blogposts/:id', to: 'blogposts#edit' patch 'blogposts/:id', to: 'blogposts#edit' get 'blogposts/delete' get 'bloggenres/index' get 'bloggenres', to: 'bloggenres#index' get 'bloggenres/add' post 'bloggenres/add' get 'bloggenres/:id', to: 'bloggenres#edit' patch 'bloggenres/:id', to: 'bloggenres#edit' get 'blogconfigs/index' get 'blogconfigs', to: 'blogconfigs#index' get 'blogconfigs/edit' patch 'blogconfigs/edit' end

試したこと

bloggenresコントローラのeditアクションで
@bloggenre = Bloggenre.find(1)のようにidを指定した場合はきちんとジャンルの名前を編集することはできました。

補足情報(FW/ツールのバージョンなど)

プログラミング初心者、初投稿なので、至らぬ点もあると思いますがどうぞよろしくお願いします。

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

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

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

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

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

guest

回答2

0

get 'blogposts/:id', to: 'blogposts#edit' patch 'blogposts/:id', to: 'blogposts#edit'

このへんが怪しい気がします
レイルズのルール的なものだと

get "blogposts/:id/edit" ,to 'blogposts#edit' post "blogposts/:id/update" to 'blogposts#update'

のような感じになるのではないかなあ、すくなくとも元のコードのように両者が'blogposts#editになってるのはおかしくないですか?

投稿2019/12/21 09:41

story_aniki

総合スコア197

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

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

0

リンクを飛ばす際に<a>タグを使っているのが気になります。

index.html.erb <a href="/bloggenres/<%= obj.id %>">Edit</a> <a href="/bloggenres/add">新規作成>></a>

idを指定した場合は動いているということなので、edit画面に飛ぶ際にparams[:id]を渡せていないのではないでしょうか?

【Rails】link_toにparamsをもたせる方法
【Rails入門説明書】link_toについて解説(パラメータを渡す)

↑を参考に<a>から<%=link_to リンク先 %>に書き換えて見てください。

投稿2019/12/13 01:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

RyukiAbe

2019/12/15 07:31

<td><%= link_to 'Edit', bloggenres, method: :edit %></td> のように修正したのですが以下のようなエラーが出てしまいます。 どのように修正したら良いでしょうか? NameError in Bloggenres#index Showing /home/ec2-user/environment/baskeblogs/app/views/bloggenres/index.html.erb where line #12 raised: undefined local variable or method `bloggenres' for #<#<Class:0x0000000004101f68>:0x0000000003e48790> Did you mean? bloggenres_url
退会済みユーザー

退会済みユーザー

2019/12/15 08:24 編集

エラー文の内容としては、index.html.erbの12行目(おそらくlink_toを書いている部分)にあるbloggenresとは何ですか?→つまりパスの指定方法が間違っている事を示しています。 なので次のように書き直してみてください。 <%= link_to 'Edit', "/bloggenres/#{obj.id}", method: :get %> ちなみに、methodの部分にはHTTPメソッドを書くのですが、 editに対応するHTTPメソッドはgetになります。(参考を載せておきます) https://railsguides.jp/routing.html https://diveintocode.jp/tips/routing01 ※上記のコードでエラーが出た場合は「rake routes」などでパスを確認してみてください
RyukiAbe

2019/12/21 06:57

<%= link_to 'Edit', "/bloggenres/#{obj.id}", method: :get %>と修正したのですが、 ActiveRecord::RecordNotFound in BloggenresController#edit Couldn't find Bloggenre with 'id'=index ''' def edit @bloggenre = Bloggenre.find(params[:id]) if request.patch? then @bloggenre.update bloggenre_params redirect_to '/bloggenres' ''' というようなエラーが出てきてしまいます。。 本来1や2のようなidが入るはずがidにindexが代入されてしまっているということでしょうか?
退会済みユーザー

退会済みユーザー

2019/12/21 09:19

「rake routes」コマンドで表示されたルーティングを載せてもらえますか?
RyukiAbe

2019/12/21 11:46 編集

こちらになります。 見にくくて申し訳ありません。 root GET / blogs#index blogs_index GET /blogs/index(.:format) blogs#index blogs GET /blogs(.:format) blogs#index GET /blogs/:page(.:format) blogs#index GET /blogs/genre/:id(.:format) blogs#genre GET /blogs/genre/:id/:page(.:format) blogs#genre GET /blogs/show/:id(.:format) blogs#show blogposts_index GET /blogposts/index(.:format) blogposts#index blogposts GET /blogposts(.:format) blogposts#index GET /blogposts/delete/:id(.:format) blogposts#delete blogposts_delete POST /blogposts/delete(.:format) blogposts#delete POST /blogposts/delete/:id(.:format) blogposts#delete blogposts_add GET /blogposts/add(.:format) blogposts#add POST /blogposts/add(.:format) blogposts#add GET /blogposts/:id(.:format) blogposts#edit PATCH /blogposts/:id(.:format) blogposts#edit GET /blogposts/delete(.:format) blogposts#delete bloggenres_index GET /bloggenres/index(.:format) bloggenres#index bloggenres GET /bloggenres(.:format) bloggenres#index bloggenres_add GET /bloggenres/add(.:format) bloggenres#add POST /bloggenres/add(.:format) bloggenres#add GET /bloggenres/:id(.:format) bloggenres#edit PATCH /bloggenres/:id(.:format) bloggenres#edit blogconfigs_index GET /blogconfigs/index(.:format) blogconfigs#index blogconfigs GET /blogconfigs(.:format) blogconfigs#index blogconfigs_edit GET /blogconfigs/edit(.:format) blogconfigs#edit PATCH /blogconfigs/edit(.:format) blogconfigs#edit 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
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問