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

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

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

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

解決済

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

istone
istone

総合スコア2

Ruby on Rails

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

1回答

0評価

0クリップ

163閲覧

投稿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

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"} 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に変えたりしてみましたが、いずれも駄目でした。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

winterboum

2022/01/06 13:04 編集

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

2022/01/06 13:47

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby on Rails

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