railsでSNSのようなアプリを開発していて、フォロー機能を実装しました。
これを非同期通信に変更したいです。
部分テンプレートのfollow
でform_for
をlink_to
に変更して、remote: true
を設定しましたが、上手くいきませんでした。
######現在のコードはこちらです。
routes
1resources :relationships, only: [:create, :destroy]
html
1<div class="follow" id="follow"> 2 <%= render partial: "shared/follow", locals: {user: @user} %> 3</div>
follow
1<% unless current_user == @user %> 2 <% if current_user.following?(@user) %> 3 <%= form_for(current_user.relationships.find_by(follow_id: @user.id), html: { method: :delete }) do |f| %> 4 <%= hidden_field_tag :follow_id, @user.id %> 5 <%= f.submit 'アンフォロー', class: 'btn follow-btn' %> 6 <% end %> 7 <% else %> 8 <%= form_for(current_user.relationships.build) do |f| %> 9 <%= hidden_field_tag :follow_id, @user.id %> 10 <%= f.submit 'フォロー', class: 'btn anfollow-btn' %> 11 <% end %> 12 <% end %> 13<% end %>
controller
1class RelationshipsController < ApplicationController 2 before_action :set_user 3 4 def create 5 following = current_user.follow(@user) 6 if following.save 7 flash[:notice] = 'ユーザーをフォローしました' 8 redirect_to @user 9 else 10 flash.now[:alert] = 'ユーザーのフォローに失敗しました' 11 redirect_to @user 12 end 13 end 14 15 def destroy 16 following = current_user.unfollow(@user) 17 if following.destroy 18 flash[:notice] = 'ユーザーのフォローを解除しました' 19 redirect_to @user 20 else 21 flash.now[:alert] = 'ユーザーのフォロー解除に失敗しました' 22 redirect_to @user 23 end 24 end 25 26 private 27 28 def set_user 29 @user = User.find(params[:follow_id]) 30 end 31end 32
relationshipmodel
1class Relationship < ApplicationRecord 2 belongs_to :user 3 belongs_to :follow, class_name: 'User' 4 5 validates :user_id, presence: true 6 validates :follow_id, presence: true 7end
class User < ApplicationRecord -----------------------------省略--------------------------------- def follow(other_user) unless self == other_user self.relationships.find_or_create_by(follow_id: other_user.id) end end def unfollow(other_user) relationship = self.relationships.find_by(follow_id: other_user.id) relationship.destroy if relationship end def following?(other_user) self.followings.include?(other_user) end end
db
1class CreateRelationships < ActiveRecord::Migration[6.0] 2 def change 3 create_table :relationships do |t| 4 t.references :user, foreign_key: true 5 t.references :follow, foreign_key: { to_table: :users } 6 t.timestamps 7 t.index [:user_id, :follow_id], unique: true 8 end 9 end 10end 11
あなたの回答
tips
プレビュー