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

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

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

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

1回答

2143閲覧

【rails】フォロー機能を実装したい

yuji_i

総合スコア1

Ruby on Rails

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2021/10/09 07:15

編集2021/10/09 08:11

前提・実現したいこと

Railsでフォロー機能を作っています。


しかしフォローボタンを押しても、フォローしたいユーザーのidが取得できず、フォローができません。

取得する方法があれば御教授いただきたいです。
初学者のため、不足しているファイルや記述があれば合わせてご指摘いただけますと幸いです。
よろしくお願いいたします。

発生している問題・エラーメッセージ

usermodelのcreateメソッドをcreate!とすることで、ActiveRecord::RecordInvalid例外が発生するためモデルに記載した下記の記述が作用しているのでしょうか?

validates :follower_id, presence: true validates :followed_id, presence: true

イメージ説明

該当のソースコード

routes.rb

1Rails.application.routes.draw do 2 devise_for :users, controllers: { 3 registrations: 'users/registrations' 4 } 5 devise_scope :user do 6 resource :relationships, only: [:create, :destroy] 7 get 'followings' => 'relationships#followings', as: 'followings' 8 get 'followers' => 'relationships#followers', as: 'followers' 9 end 10 11 root to: "home#index" 12 resources :home, only: [:index, :show] 13 get 'home/likes/:id', to: 'home#like_list', as: 'home_likes' 14end

app/views/home/show.html.erb

1views/home/show.html.erbのボタン部分抜粋 2 3<% if current_user.following?(@user) %> 4 <%= link_to "Unfollow", relationships_path(@user.id), method: :delete %> 5<% else %> 6 <%= link_to "Follow", relationships_path(@user.id), method: :post %> 7<% end %>
db/migrate/20211006083038_create_relationships.rbの記述 class CreateRelationships < ActiveRecord::Migration[6.0] def change create_table :relationships do |t| t.references :followed, foreign_key: { to_table: :users } t.references :follower, foreign_key: { to_table: :users } # follower_id : フォローするユーザーのid # followed_id : フォローされるユーザーのid t.timestamps t.index [:followed_id, :follower_id], unique: true end end end
app/models/relationship.rb class Relationship < ApplicationRecord belongs_to :follower, class_name: "User" belongs_to :followed, class_name: "User" validates :follower_id, presence: true validates :followed_id, presence: true end

user.rb

1 2ユーザーモデルフォロー機能部分抜粋 3 4 has_many :reverse_of_relationships, class_name: "Relationship", foreign_key: "followed_id", dependent: :destroy 5 has_many :followers, through: :reverse_of_relationships, source: :follower 6 has_many :relationships, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy 7 has_many :followings, through: :relationships, source: :followed 8 9 def follow(user_id) 10 relationships.create!(followed_id: user_id) 11 end 12 13 def unfollow(user_id) 14 relationships.find_by(followed_id: user_id).destroy 15 end 16 17 def following?(user) 18 followings.include?(user) 19 end
RelationshipsControllerの記述 class RelationshipsController < ApplicationController def create current_user.follow(params[:user_id]) redirect_to request.referer end def destroy current_user.unfollow(params[:user_id]) redirect_to request.referer end #フォロー・フォロワー一覧を表示する def followings user = User.find(params[:user_id]) @users = user.followings end def followers user = User.find(params[:user_id]) @users = user.followers end end

##追記

showの部分のみ抜粋 class HomeController < ApplicationController def show @user = User.find(params[:id]) @account = Account.find(params[:id]) @likes = @user.likes # @post = Post.find(params[:id]) end end

コンソールでは問題なく実行できましたので、アソシエーションには問題がないのでしょうか?
![イメージ説明]

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

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

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

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

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

guest

回答1

0

ベストアンサー

views/home/show.html.erb を呼び出す controller で @userを定義していないからです。

投稿2021/10/09 07:44

winterboum

総合スコア23567

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

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

yuji_i

2021/10/09 08:16

ご回答頂きありがとうございます。 app/controllers/home_controller.rbのshowアクションには@userの定義は確認できました。
winterboum

2021/10/09 08:41

もしかして、user_id でなくid で来てませんか? log で Paramaters 確認してください
yuji_i

2021/10/09 11:54

ご回答頂きありがとうございます。 logを確認させていただきましたところ、 {"_method"=>"post", "authenticity_token"=>"UKfLBSs1i/Q7jD9BlaMBmochnAc6Y01CvYMqESOqf54/+j5lyaB/aoemTqoAZXVtVXJA3xkCTmjm/vMDDRHAKg==", "format"=>"2"} 上記のようになっておりました。 idではなく、"format"=>"2"として渡ってきているためエラーになっていることでしょうか? こちらをidとして受け渡す方法を一度調べてまいります。
winterboum

2021/10/09 12:36

format ?? controllerのcreate載せてください views/home/show.html.erb がhtml展開されたやつの link_to の部分載せてください
yuji_i

2021/10/09 13:20

ご回答ありがとうございます。 下記が該当コードとなります。 ``` 【views/home/show.html.erb】 <% if current_user.following?(@user) %> <%= link_to "Unfollow", relationships_path(@user.id), method: :delete %> <% else %> <%= link_to "Follow", relationships_path(@user.id), method: :post %> <% end %> ``` ``` 【app/controllers/relationships_controller.rb】 def create current_user.follow(params[:user_id]) redirect_to request.referer end ``` ご確認いただけますと幸いです。 よろしくお願いいたします。
winterboum

2021/10/10 04:34

views/home/show.html.er ではなく、それがhtmlになっているやつです
yuji_i

2021/10/10 05:05

ご回答ありがとうございます。 htmlですと、現状下記のようになっております。 <a rel="nofollow" data-method="post" href="/relationships.1">Follow</a> ご確認いただけますと幸いです。
winterboum

2021/10/10 06:23

するとこうかな relationships_path(user_id: @user.id)
yuji_i

2021/10/10 10:41

winterboum様、何度もご丁寧にご返信いただきありがとうございます。 お教えいただきましたように、記述を修正したところ無事にフォローできるようになりました。 htmlも下記のようになり、user_idとして受け渡しができているようです。 <a rel="nofollow" data-method="post" href="/relationships?user_id=1">Follow</a> おかげで次に進むことができそうです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問