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

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

ただいまの
回答率

90.51%

  • Ruby

    9431questions

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

  • Ruby on Rails 5

    3178questions

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 159

実現したいこと

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

モデル

app/models/user.rb

class User < ApplicationRecord
  has_many :microposts, dependent: :destroy
  has_many :replies, dependent: :destroy
....

app/models/micropost.rb

class Micropost < ApplicationRecord
  belongs_to :user
  has_many :replies
....

app/models/replies.rb

class Reply < ApplicationRecord
  belongs_to :micropost
  belongs_to :user
end

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

コントローラ

app/controllers/replies_controller.rb

....
#destroyのみを抜粋
  def destroy
    @micropost = Micropost.find(params[:micropost_id])
    @replies = @micropost.replies
    Reply.find(params[:micropost_id]).destroy
    flash[:success] = "リプライを削除しました"
    redirect_to @micropost
  end
....

ビュー

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

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

エラーの中身

Replyのid: 257がない?


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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

                 Prefix Verb   URI Pattern                                     Controller#Action
    password_resets_new GET    /password_resets/new(.:format)                  password_resets#new
   password_resets_edit GET    /password_resets/edit(.:format)                 password_resets#edit
                   root GET    /                                               static_pages#home
                   help GET    /help(.:format)                                 static_pages#help
                  about GET    /about(.:format)                                static_pages#about
                contact GET    /contact(.:format)                              static_pages#contact
                 signup GET    /signup(.:format)                               users#new
                  login GET    /login(.:format)                                sessions#new
                        POST   /login(.:format)                                sessions#create
                 logout DELETE /logout(.:format)                               sessions#destroy
         following_user GET    /users/:id/following(.:format)                  users#following
         followers_user GET    /users/:id/followers(.:format)                  users#followers
                  users GET    /users(.:format)                                users#index
                        POST   /users(.:format)                                users#create
               new_user GET    /users/new(.:format)                            users#new
              edit_user GET    /users/:id/edit(.:format)                       users#edit
                   user GET    /users/:id(.:format)                            users#show
                        PATCH  /users/:id(.:format)                            users#update
                        PUT    /users/:id(.:format)                            users#update
                        DELETE /users/:id(.:format)                            users#destroy
edit_account_activation GET    /account_activations/:id/edit(.:format)         account_activations#edit
        password_resets POST   /password_resets(.:format)                      password_resets#create
     new_password_reset GET    /password_resets/new(.:format)                  password_resets#new
    edit_password_reset GET    /password_resets/:id/edit(.:format)             password_resets#edit
         password_reset PATCH  /password_resets/:id(.:format)                  password_resets#update
                        PUT    /password_resets/:id(.:format)                  password_resets#update
      micropost_replies POST   /microposts/:micropost_id/replies(.:format)     replies#create
    new_micropost_reply GET    /microposts/:micropost_id/replies/new(.:format) replies#new
        micropost_reply GET    /microposts/:micropost_id/replies/:id(.:format) replies#show
                        DELETE /microposts/:micropost_id/replies/:id(.:format) replies#destroy
      search_microposts GET    /microposts/search(.:format)                    microposts#search
             microposts POST   /microposts(.:format)                           microposts#create
              micropost GET    /microposts/:id(.:format)                       microposts#show
                        DELETE /microposts/:id(.:format)                       microposts#destroy
          relationships POST   /relationships(.:format)                        relationships#create
           relationship DELETE /relationships/:id(.:format)                    relationships#destroy

コントローラ  

app/controllers/replies_controller.rb

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

ビュー

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

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

わかったこと

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • Ruby

    9431questions

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

  • Ruby on Rails 5

    3178questions