前提
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
class Record < ApplicationRecord belongs_to :user belongs_to :folder has_many :memos, dependent: :destroy end
memo
class Memo < ApplicationRecord belongs_to :user belongs_to :folder belongs_to :record end
コントローラ
record
class RecordsController < ApplicationController before_action :authenticate_user! before_action :set_folder before_action :set_record, only: [:index, :show, :edit, :update, :destroy] . . . def show @memo = @record.memos.all.find_by(params[:memo_id]) @memos = @record.memos.all.order(created_at: :desc) end . . . def set_folder @folder = current_user.folders.find_by(id: params[:folder_id]) end def set_record @record = @folder.records.find_by(id: params[:id]) end . . . end
memo
class MemosController < ApplicationController before_action :authenticate_user! before_action :set_folder before_action :set_record before_action :set_memo, only: [:edit, :update, :destroy] . . . def edit end . . . def set_folder @folder = current_user.folders.find_by(id: params[:folder_id]) end def set_record @record = @folder.records.find_by(id: params[:record_id]) end def set_memo @memo = @record.memos.find_by(params[:id]) end . . . end
ビュー
recordのshow.html
record
<% @memos.each do |memo| %> <%= link_to edit_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>
memoのedit.html
memo
<%= render 'form', memo: @memo %>
memoの_form.html
memo
<div> <%= form_with(model: [@folder, @record, @memo], local: true) do |form| %> . . . <% end %> </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に変えたりしてみましたが、いずれも駄目でした。
まだ回答がついていません
会員登録して回答してみよう