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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1674閲覧

ruby on rails チュートリアル 14章 フォロー機能のdestroyアクションの記述でわからないところがあります。

natecosan

総合スコア23

Ruby on Rails 5

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

Ruby on Rails

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

0グッド

1クリップ

投稿2019/04/16 12:15

わからないこと

Ruby on Rails チュートリアル14章「14.2.4 [Follow] ボタン (基本編)」
のdestroyアクション実装の部分でわからないところがあるので質問させてください。

user = Relationship.find(params[:id).followed
ということは、
「Relatihonshipテーブルにおいて、idカラムがparams[:id]のフォロー中ユーザー」をuserとしているということですよね。
この場合、unfollowボタンのビュー記述部分に記載している「followed_id:@user.id」が上記のparams[:id]に当てはまるという理解で合っていますでしょうか?
そして、合っていたとしたら、find(params[:follwed_id]).followedと書かないのはなぜでしょうか?

雑多な説明で恐縮ですが、よろしくおねがいします・・・!

該当のソースコード

リスト 14.33: Relationshipsコントローラ
app/controllers/relationships_controller.rb

class RelationshipsController < ApplicationController before_action :logged_in_user def create user = User.find(params[:followed_id]) current_user.follow(user) redirect_to user end def destroy user = Relationship.find(params[:id]).followed #ここの部分 current_user.unfollow(user) redirect_to user end end

unfollowボタンのビュー記述部分

<%= form_for(current_user.active_relationships.find_by(followed_id: @user.id), html:{ method: :delete}) do |f| %> <%= f.submit "Unfollow", class: "btn" %> <% end %>

user.rb

def unfollow(other_user) active_relationships.find_by(followed_id: other_user.id).destroy end

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

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

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

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

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

guest

回答1

0

ベストアンサー

user = Relationship.find(params[:id).followed

ということは、
「Relatihonshipテーブルにおいて、idカラムがparams[:id]のフォロー中ユーザー」をuserとしているということですよね。

「Relatsionshipテーブルにおいて、idカラムがparams[:id]の行のフォロー中ユーザー」
という意味ならばそうです。

この場合、unfollowボタンのビュー記述部分に記載している「followed_id:@user.id」が上記のparams[:id]に当てはまるという理解で合っていますでしょうか?

いいえ、別です。
図 14.7にidカラムがないのが誤解の原因なのかな?と思いますが
Relatihonshipテーブルにもidカラムがあり、Userテーブルとは無関係にユニークな番号が振られているわけです。

図 14.7をこう読み替えるといいかもしれません。

follower_ididfollowed
112
127
331
742
1510
261
178
981

ただし、user

erb

1<%= form_for(current_user.active_relationships.find_by(followed_id: @user.id), 2 html:{ method: :delete}) do |f| %> 3 <%= f.hidden_field :followed_id, @user.id %> 4 <%= f.submit "Unfollow", class: "btn" %> 5<% end %>

とすることで

ruby

1def destroy 2 user = User.find(params[:followed_id]) 3 # 省略 4end

が可能です。

こうしなかった理由はCRUDとしての統一感を重視したのかなと思います。

Relationshipコントローラーのdestroyメソッドなんだから
Relationshipのidを渡して削除しようという考えかなと思います。

まぁ、つまり

ruby

1class RelationshipsController 2 def destroy 3 Relationship.find(params[:id]).destroy 4 end 5end

こうですね。

しかしこれでは、他人のフォロワーを勝手に解除できてしまいます。
そこで遠回りして、other_userを取得しcurrent_userを介して解除しています。

投稿2019/04/16 23:51

asm

総合スコア15147

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

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

natecosan

2019/04/17 12:05

回答ありがとうございます。 アプリケーション側でのコード実行順序がよく分かっておらず、混乱していたみたいです。。。 つまり、form_forタグのcurrent_user.active_relationships.find_by(followed_id: @user.id)の部分で先にfollowed_id: @user.idであるユーザーを探しておいて、そのレコードにあるidカラムの値をparams[:id]として受け取る→Relationshipの該当レコードを削除 ということですか?
asm

2019/04/17 13:16 編集

> form_forタグのcurrent_user.active_relationships.find_by(followed_id: @user.id)の部分で先にfollowed_id: @user.idであるユーザーを探しておいて current_user.active_relationships.find_by(followed_id: @user.id)は follower_id: current_user.idかつfollowed_id: @user.idなRelationshipを探しており そのidをparams[:id]としてコントローラに渡しています。 そして、コントローラ側はそのparams[:id]からRelationshipを探して(最終的に)削除しています
natecosan

2019/04/17 23:58

なるほど!わかりました。ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問