前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/09 08:16
2021/10/09 08:41
2021/10/09 11:54
2021/10/09 12:36
2021/10/09 13:20
2021/10/10 04:34
2021/10/10 05:05
2021/10/10 06:23
2021/10/10 10:41