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

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

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

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

Q&A

解決済

1回答

1178閲覧

【Rails】2段階ネストしたテーブルのedit画面がurlに表示されているidと食い違う

istone

総合スコア2

Ruby on Rails

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

0グッド

0クリップ

投稿2022/01/06 12:20

編集2022/01/06 13:55

前提

Railsでアプリを作成しています。
ネストを2段階行い、親(folder),子(record)、孫(memo)といった構成になっているのですが、
子(record)のshowのviewで孫(memo)のeditへのリンクを作成するために

<% @memos.each do |memo| %> <%= link_to folder_record_memo_path(@folder,@record,memo), class: "memo-card-edit" do%> <div class="memo-card"> <p class="memo-card_title"><%= memo.title %></p> <p class="memo-card_coment"><%= memo.coment %></p> </div> <% end %> <% end %> </div>

このように記述しています。

発生している問題

link_to folder_record_memo_path(@folder,@record,memo)

からmemoのedit画面に遷移することはできるのですが、複数作成したどmemoのlinkをクリックしても、
一番古いmemoへのedit画面にしか遷移しません。
ただURL自体はきちんとクリックしたmemoのidが反映されています。

例えば、3つ目のmemoをクリックすると、URLは

folder/1/records/1/memos/3

になっているのですが、

folder/1/record/1memos/1

のedit画面が表示される状況です。
どのmemoをクリックしてもURLは正しいのにmemos/1のeditが表示されます。

該当のソースコード

route.rb

Rails.application.routes.draw do resources :folders do resources :records do resources :memos end end devise_for :users end

モデル

record

1class Record < ApplicationRecord 2 belongs_to :user 3 belongs_to :folder 4 has_many :memos, dependent: :destroy 5end

memo

1class Memo < ApplicationRecord 2 belongs_to :user 3 belongs_to :folder 4 belongs_to :record 5end

コントローラ

record

1class RecordsController < ApplicationController 2 before_action :authenticate_user! 3 before_action :set_folder 4 before_action :set_record, only: [:index, :show, :edit, :update, :destroy] 5 . 6 . 7 . 8def show 9 @memo = @record.memos.all.find_by(params[:memo_id]) 10 @memos = @record.memos.all.order(created_at: :desc) 11end 12 . 13 . 14 . 15def set_folder 16 @folder = current_user.folders.find_by(id: params[:folder_id]) 17end 18 19def set_record 20 @record = @folder.records.find_by(id: params[:id]) 21end 22 . 23 . 24 . 25end 26

memo

1class MemosController < ApplicationController 2 before_action :authenticate_user! 3 before_action :set_folder 4 before_action :set_record 5 before_action :set_memo, only: [:edit, :update, :destroy] 6 . 7 . 8 . 9def edit 10end 11 . 12 . 13 . 14def set_folder 15        @folder = current_user.folders.find_by(id: params[:folder_id]) 16end 17 18def set_record 19 @record = @folder.records.find_by(id: params[:record_id]) 20end 21 22def set_memo 23 @memo = @record.memos.find_by(params[:id]) 24end 25 . 26 . 27 . 28end 29

ビュー

recordのshow.html

record

1<% @memos.each do |memo| %> 2 <%= link_to edit_folder_record_memo_path(@folder,@record,memo), class: "memo-card-edit" do%> 3 <div class="memo-card"> 4 <p class="memo-card_title"><%= memo.title %></p> 5 <p class="memo-card_coment"><%= memo.coment %></p> 6 </div> 7 <% end %> 8 <% end %> 9 </div>

memoのedit.html

memo

1<%= render 'form', memo: @memo %>

memoの_form.html

memo

1<div> 2 <%= form_with(model: [@folder, @record, @memo], local: true) do |form| %> 3 . 4 . 5 . 6 <% end %> 7</div>

log/development.log

Started GET "/folders/3/records/3/memos/22/edit" for 122.222.88.207 at 2022-01-06 13:47:00 +0000 Cannot render console from 122.222.88.207! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by MemosController#edit as HTML Parameters: {"folder_id"=>"3", "record_id"=>"3", "id"=>"22"} User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/activerecord-5.2.6/lib/active_record/log_subscriber.rb:98 Folder Load (0.1ms) SELECT "folders".* FROM "folders" WHERE "folders"."user_id" = ? AND "folders"."id" = ? LIMIT ? [["user_id", 1], ["id", 3], ["LIMIT", 1]] ↳ app/controllers/memos_controller.rb:49 Record Load (0.1ms) SELECT "records".* FROM "records" WHERE "records"."folder_id" = ? AND "records"."id" = ? LIMIT ? [["folder_id", 3], ["id", 3], ["LIMIT", 1]] ↳ app/controllers/memos_controller.rb:54 Memo Load (0.2ms) SELECT "memos".* FROM "memos" WHERE "memos"."record_id" = ? AND (22) LIMIT ? [["record_id", 3], ["LIMIT", 1]] ↳ app/controllers/memos_controller.rb:59 Rendering memos/edit.html.erb within layouts/application Rendered memos/_form.html.erb (8.8ms) Rendered memos/edit.html.erb within layouts/application (11.0ms) Rendered layouts/_header.html.erb (0.7ms) Completed 200 OK in 128ms (Views: 116.1ms | ActiveRecord: 0.5ms)

ここでは "id"=>"22" となっていますが、実際のeditの表示はid=18の表示になっています。

試したこと

<%= link_to edit_folder_record_memo_path(@folder,@record,memo), class: "memo-card-edit" do%>

のmemoの部分を、@memoやmemo.idにしてみたり、

<%= render 'form', memo: @memo %>
<%= form_with(model: [@folder, @record, @memo], local: true) do |form| %>

の@memoの部分をmemoやmemo.idに変えたりしてみましたが、いずれも駄目でした。

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

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

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

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

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

winterboum

2022/01/06 13:04 編集

routes.rbも載せたほうがよいかも。 あと、log/development.log の該当部分も
istone

2022/01/06 13:47

routes.rbの記載、前回もご指摘いただいたのにすみません...。 毎度ありがとうございます! log/development.log の該当部分も記載いたします!
guest

回答1

0

ベストアンサー

@record.memos.find_by(params[:id])
ここですね
@record.memos.find_by(id: params[:id]) か「
@record.memos.find(params[:id])

WHERE "memos"."record_id" = ? AND (22) LIMIT ?
となり、memoのidでの絞り込みがなされていないので、record_id=3の最初のMemoがhitしてます。

投稿2022/01/06 22:38

winterboum

総合スコア23567

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

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

istone

2022/01/07 05:27

なるほどです!findとfind_byの違いも良く分からないまま使っていたので、そこの間違いに気づきませんでした...。勉強になりました!ありがとうございます!!無事解決致しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問