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

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

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

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

Ruby

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

Q&A

解決済

2回答

1432閲覧

[ruby on rails]アソシエーションで繋いだデータの取得方法

hiroshimaeasyry

総合スコア15

Ruby on Rails 5

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

Ruby

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

0グッド

1クリップ

投稿2019/01/06 06:50

実現したいこと

Ruby on Rails Tutorialの拡張機能として、micropostに返信機能をつけようとしています。
それにあたって、チュートリアルの中で作ったUserモデル、Micropostモデルに加えて新たにReplyモデルを作り、
この三者を関連付け(アソシエーション)、それぞれのデータを取得しやすくしました。
今、edit、update、destroyアクションを実装していく中でこのアソシエーション用いてどのように
データを取得してきたら良いかわからず困っている、という状況です。

モデル

app/models/user.rb

ruby

1class User < ApplicationRecord 2 has_many :microposts, dependent: :destroy 3 has_many :replies, dependent: :destroy 4....

app/models/micropost.rb

ruby

1class Micropost < ApplicationRecord 2 belongs_to :user 3 has_many :replies 4....

app/models/replies.rb

ruby

1class Reply < ApplicationRecord 2 belongs_to :micropost 3 belongs_to :user 4end

こういうイメージです
ER図

コントローラ

app/controllers/replies_controller.rb

ruby

1.... 2#destroyのみを抜粋 3 def destroy 4 @micropost = Micropost.find(params[:micropost_id]) 5 @replies = @micropost.replies 6 Reply.find(params[:micropost_id]).destroy 7 flash[:success] = "リプライを削除しました" 8 redirect_to @micropost 9 end 10....

ビュー

_app/views/replies/reply.html.erb
(パーシャルの中身のみ記載)

html

1 <li class="reply_feed"> 2 <span class="content"> 3 <%= reply.response %> 4 <% if current_user?(reply.user) %> 5 <%= link_to "編集", edit_micropost_reply_path(micropost_id: @micropost, reply_id: reply.id), class: 'btn btn-warning' %> 6 <%= link_to "削除", micropost_reply_path(micropost_id: @micropost, reply_id: reply.id), method: :delete, class: 'btn btn-danger', data: {confirm: "削除しますか?"} %> 7 <% end %> 8 </span> 9 </li>

エラーの中身

Replyのid: 257がない?


このURLもなんだか想定しているものと違う気がします。

このデータベース上のid: 14を削除しようとしているので、上のコードだと指定しているものが違う気がします。

どのように書くのが正しいかわかりましたらご教示いただけるとありがたいです。

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

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

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

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

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

guest

回答2

0

未解決のままスレッドと質問の仕方を改めるため一旦この質問を強引に閉じようとしましたが、結果的に解決しました。

ルーティングは間違っていなかった

console

1 Prefix Verb URI Pattern Controller#Action 2 password_resets_new GET /password_resets/new(.:format) password_resets#new 3 password_resets_edit GET /password_resets/edit(.:format) password_resets#edit 4 root GET / static_pages#home 5 help GET /help(.:format) static_pages#help 6 about GET /about(.:format) static_pages#about 7 contact GET /contact(.:format) static_pages#contact 8 signup GET /signup(.:format) users#new 9 login GET /login(.:format) sessions#new 10 POST /login(.:format) sessions#create 11 logout DELETE /logout(.:format) sessions#destroy 12 following_user GET /users/:id/following(.:format) users#following 13 followers_user GET /users/:id/followers(.:format) users#followers 14 users GET /users(.:format) users#index 15 POST /users(.:format) users#create 16 new_user GET /users/new(.:format) users#new 17 edit_user GET /users/:id/edit(.:format) users#edit 18 user GET /users/:id(.:format) users#show 19 PATCH /users/:id(.:format) users#update 20 PUT /users/:id(.:format) users#update 21 DELETE /users/:id(.:format) users#destroy 22edit_account_activation GET /account_activations/:id/edit(.:format) account_activations#edit 23 password_resets POST /password_resets(.:format) password_resets#create 24 new_password_reset GET /password_resets/new(.:format) password_resets#new 25 edit_password_reset GET /password_resets/:id/edit(.:format) password_resets#edit 26 password_reset PATCH /password_resets/:id(.:format) password_resets#update 27 PUT /password_resets/:id(.:format) password_resets#update 28 micropost_replies POST /microposts/:micropost_id/replies(.:format) replies#create 29 new_micropost_reply GET /microposts/:micropost_id/replies/new(.:format) replies#new 30 micropost_reply GET /microposts/:micropost_id/replies/:id(.:format) replies#show 31 DELETE /microposts/:micropost_id/replies/:id(.:format) replies#destroy 32 search_microposts GET /microposts/search(.:format) microposts#search 33 microposts POST /microposts(.:format) microposts#create 34 micropost GET /microposts/:id(.:format) microposts#show 35 DELETE /microposts/:id(.:format) microposts#destroy 36 relationships POST /relationships(.:format) relationships#create 37 relationship DELETE /relationships/:id(.:format) relationships#destroy

コントローラ

app/controllers/replies_controller.rb

ruby

1.... 2#destroyのみを抜粋 3 def destroy 4 @micropost = Micropost.find(params[:micropost_id]) 5 Reply.find(params[:id]).destroy 6 flash[:success] = "リプライを削除しました" 7 redirect_to @micropost 8 end 9....

ビュー

_app/views/replies/reply.html.erb
(パーシャルの中身のみ記載)

html

1 <li class="reply_feed"> 2 <span class="content"> 3 <%= reply.response %> 4 <% if current_user?(reply.user) %> 5 <%= link_to "削除", micropost_reply_path(micropost_id: @micropost.id, id: reply.id), method: :delete, class: 'btn btn-danger', data: {confirm: "削除しますか?"} %> 6 <% end %> 7 </span> 8 </li>

わかったこと

ネストルーティングに関して、ルーティングの書き方についての記事は調べるといくつか見つかったものの、
実際にビューやコントローラでその中のデータをどのように取得してくるかについては
記事が見つかりにくく正当を導くのに時間がかかりました。
自分の備忘録としてこの記事を残しておきたいと思います。

投稿2019/01/07 14:18

hiroshimaeasyry

総合スコア15

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

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

0

自己解決

解決していませんが、一旦この質問は閉めさせていただきたいと思います。

理由は、質問の最後に記載した部分に絡むのですが、URLに違和感があったこと...
つまりルーティングに問題がありそうなので、ヒントを得るべく別途ルーティングに関して
質問をさせていただきたいと思ったからです(これも調べましたが答えが得られそうもなく...)。

投稿2019/01/06 15:22

hiroshimaeasyry

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問