前提
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"} [1m[36mUser Load (0.1ms)[0m [1m[34mSELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?[0m [["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 [1m[36mFolder Load (0.1ms)[0m [1m[34mSELECT "folders".* FROM "folders" WHERE "folders"."user_id" = ? AND "folders"."id" = ? LIMIT ?[0m [["user_id", 1], ["id", 3], ["LIMIT", 1]] ↳ app/controllers/memos_controller.rb:49 [1m[36mRecord Load (0.1ms)[0m [1m[34mSELECT "records".* FROM "records" WHERE "records"."folder_id" = ? AND "records"."id" = ? LIMIT ?[0m [["folder_id", 3], ["id", 3], ["LIMIT", 1]] ↳ app/controllers/memos_controller.rb:54 [1m[36mMemo Load (0.2ms)[0m [1m[34mSELECT "memos".* FROM "memos" WHERE "memos"."record_id" = ? AND (22) LIMIT ?[0m [["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に変えたりしてみましたが、いずれも駄目でした。
回答1件
あなたの回答
tips
プレビュー