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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

Q&A

解決済

1回答

755閲覧

質問・railsのルーティングをネストした時の件について。

hatopopo21

総合スコア40

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

ルーティング

ルーティングとは、TCP/IPネットワークにおいて、目的のホストまでパケットを送る為のパス選定のプロセスを言います。

0グッド

0クリップ

投稿2021/02/11 09:55

編集2021/02/11 15:14

質問

ルーティングでネストした子要素を、idで取得することができるのでしょうか?

今していること

現在、オリジナルアプリを開発をrailsを用いて行っています。
編集と削除機能を実装しようとしています。
ルーティングにネストを行い、ネストした子要素のidを取得したいのですが、取得することができません。
ルーティングは以下のようにしています。

Ruby

1 resources :rooms, only: [:new, :create, :destroy] do 2 resources :memos, except: :new 3 end

実現したいこと

ルームを生成したら、そのルームに複数メモを追加できるようにしています。
メモの機能は入力蘭に文字を入力して、送信ボタンで保存するようにしているため直接編集をすることができません。
そのために、メモ毎に編集できるようにしたいと思いました。

私のイメージしているURLは
http://localhost:3000/rooms/11/memos/1/edit
ルーム13にあるメモ1番を修正するといった具合にしたいです。

しかし自分なりに、試してはみたのですが、memoのidを取得することができません。

veiw

Ruby

1<div class="memo-contents"> 2 <div class="memo-area"> 3 <% @memos.each do |memo| %> 4 <div class="box25"> 5 <p><%= memo.content %></p> 6 7 <%= link_to '編集', edit_room_memo_path(@room, @memo), class: "edit-btn" %> 8 <%= link_to '削除', "/rooms/#{@room.id}/memos/#{@memo.id}", method: :delete, class: "delete-btn", data: { confirm: '削除しますか?' } %> 9 </div> 10 <% end %> 11 </div> 12</div> 13

controller

Ruby

1class MemosController < ApplicationController 2 3 def index 4 @rooms = Room.all 5 @memo = Memo.all 6 @events = Event.all 7 @memo = Memo.new 8 @event = Event.new 9 @room = Room.find(params[:room_id]) 10 @memos = @room.memos.includes(:user) 11 end 12 13 def create 14 @room = Room.find(params[:room_id]) 15 @memo = @room.memos.new(memo_params) 16 if @memo.save 17 redirect_to room_memos_path(@room) 18 else 19 render :index 20 end 21 end 22 23 def edit 24 @memo = Room.find(params[:id]) 25 end 26 27 def update 28 end 29 30 def destroy 31 end 32 33 private 34 def memo_params 35 params.require(:memo).permit(:content).merge(user_id: current_user.id) 36 end 37end

routes

Ruby

1 room_memos GET /rooms/:room_id/memos(.:format) memos#index 2 POST /rooms/:room_id/memos(.:format) memos#create 3 edit_room_memo GET /rooms/:room_id/memos/:id/edit(.:format) memos#edit 4 room_memo GET /rooms/:room_id/memos/:id(.:format) memos#show 5 PATCH /rooms/:room_id/memos/:id(.:format) memos#update 6 PUT /rooms/:room_id/memos/:id(.:format) memos#update 7 DELETE /rooms/:room_id/memos/:id(.:format) memos#destroy 8 rooms POST /rooms(.:format) rooms#create 9 new_room GET /rooms/new(.:format) rooms#new 10 room DELETE /rooms/:id(.:format) rooms#destroy

これは仕方が無いことなのでしょうか?
アドバイスお願いします!

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

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

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

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

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

m.ts10806

2021/02/11 10:01

想定する具体的なURLを提示され方が良いかと思います。
m.ts10806

2021/02/11 10:46

質問は編集できますので。
winterboum

2021/02/11 11:50

「ネストしたルーティングの子要素はidを使用するメンバー(:show, :edit, :update, :destroy)は使用しない方が良い」これ初耳です。URL教えてください
siruku6

2021/02/11 13:00

http://localhost:3000/rooms/11/memos/1/edit このURLにアクセスして編集画面が開けるのであれば、おそらくmemoのIDも取得できるようになります。 routingだけではなく、controllerやviewファイルが原因で問題が発生している可能性がありますので、それらを質問文に掲載すると回答が付きやすくなるかと思います。
hatopopo21

2021/02/11 15:04

winterboumさん urlはこちらです。 https://railsguides.jp/routing.html 場所は2.7.2 「浅い」ネストです。 ですが、「浅い」ネストをするのであれば、メンバーは使用を避ける方が良いと書いてあり 私の解釈の間違えでした。申し訳ございません。
m.ts10806

2021/02/11 21:45

私ならあえてresources使わずに自前でルーティング書いてしまいますね。 あまり依存しすぎるのも自由度下がるので。
hatopopo21

2021/02/12 00:50

たくさんのアドバイスありがとうございます! これまでresourcesしか使ったことがなかったので、 一度別の書き方をしてみたいと思います!
guest

回答1

0

ベストアンサー

それは、「使用しない方が良い」ではなく、「深いネストを避けるひとつの方法」です。子要素の編集をするには子要素のIDが必要ですから、ネストしたroutesでやるなら、edit を避けることは出来ません。
で、私はネストしたrouteは好まないので、
resorces :memos して link_to '編集', edit_memo_path(memo)です。
ネストしようがしまいが MemosController#updateです。

投稿2021/02/11 23:10

winterboum

総合スコア23347

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

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

hatopopo21

2021/02/12 00:46

最後までアドバイスいただきありがとうございます! 参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問