How do I add a "Add Friend" button to users page? I tried using <%= link_to "Add Friend", new_friend_requests_path, method: :post %> but didn't seem to work.
Any help would be appreciated.
FriendsController.rb
class FriendsController < ApplicationController
before_action :set_friend, only: :destroy
def index
@friends = current_user.friends
end
def destroy
current_user.remove_friend(@friend)
head :no_content
end
...
private
def set_friend
@friend = current_user.friends.find(params[:id])
end
end
FriendRequestsController.rb
class FriendRequestsController < ApplicationController
before_action :set_friend_request, except: [:index, :create]
def index
@incoming = FriendRequest.where(friend: current_user)
@outgoing = current_user.friend_requests
end
def create
friend = User.find(params[:friend_id])
@friend_request = current_user.friend_requests.new(friend: friend)
if @friend_request.save
render :show, status: :created, location: @friend_request
else
render json: @friend_request.errors, status: :unprocessable_entity
end
end
def destroy
@friend_request.destroy
head :no_content
end
def update
@friend_request.accept
head :no_content
end
private
def set_friend_request
@friend_request = FriendRequest.find(params[:id])
end
end
User.rb
class User < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: :slugged
has_many :friend_requests, dependent: :destroy
has_many :pending_friends, through: :friend_requests, source: :friend
has_many :friendships, dependent: :destroy
has_many :friends, through: :friendships
def remove_friend(friend)
current_user.friends.destroy(friend)
end
end
Friendship.rb
class Friendship < ActiveRecord::Base
after_create :create_inverse_relationship
after_destroy :destroy_inverse_relationship
belongs_to :user
belongs_to :friend, class_name: 'User'
validates :user, presence: true
validates :friend, presence: true, uniqueness: { scope: :user }
private
def create_inverse_relationship
friend.friendships.create(friend: user)
end
def destroy_inverse_relationship
friendship = friend.friendships.find_by(friend: user)
friendship.destroy if friendship
end
def not_self
errors.add(:friend, "can't be equal to user") if user == friend
end
end
FriendRequest.rb
class FriendRequest < ActiveRecord::Base
belongs_to :user
belongs_to :friend, class_name: 'User'
validate :not_self
validate :not_friends
validate :not_pending
def accept
user.friends << friend
destroy
end
private
def not_self
errors.add(:friend, "can't be equal to user") if user == friend
end
def not_pending
errors.add(:friend, 'already requested friendship') if friend.pending_friends.include?(user)
end
end
CreateFriendships | Migration
class CreateFriendships < ActiveRecord::Migration
def change
create_table :friendships do |t|
t.references :user, index: true
t.references :friend, index: true
t.timestamps null: false
end
add_foreign_key :friendships, :users
add_foreign_key :friendships, :friends
end
end
CreateFriendRequests | Migration
class CreateFriendRequests < ActiveRecord::Migration
def change
create_table :friend_requests do |t|
t.references :user, index: true
t.references :friend, index: true
t.timestamps null: false
end
add_foreign_key :friend_requests, :users
add_foreign_key :friend_requests, :friends
end
end
Routes.rb
Rails.application.routes.draw do
get 'friends/index'
get 'friends/destroy'
resources :friend_requests
end
Aucun commentaire:
Enregistrer un commentaire