Whenever a users adds friends, a message is sent to the other letting them know they should accept friendship. They accept friend and the two users become friend. The issues with this code, <%= pluralize(current_user.friends.count, "friend") %>
It doesn't work, it just shows 0 friends, even if both users friended each other. How do you fix this? I want when the two users add each other, on their profile page, it should state each one has a friend. Any help would be appreciated.
users/show.html.erb
<%= pluralize(current_user.friends.count, "friend") %>
<%= render "friend_form", user: @user, friendship: @friendship unless current_user == @user %>
users/_friends_form.html.erb
<% if friendship.nil? %>
<%= link_to "+ Friend", friend_requests_path(add_id: user.id), method: :post, class: "btn btn-primary" %>
<% elsif friendship.confirmed? %>
<%= link_to "Unfriend", friend_request_path(id: friendship.id, user_id: user.id), method: :delete, class: "btn btn-primary" %>
<% elsif friendship.receiver_id == user.id %>
<%= "Friend request sent." %>
<% elsif friendship.sender_id == user.id %>
<%= link_to "Confirm", friend_request_path(friendship), method: :patch, class: "btn btn-primary" %>
<% end %>
User.rb
class User < ActiveRecord::Base
extend FriendlyId
attr_accessor :remember_token, :activation_token, :reset_token
friendly_id :name, use: :slugged
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :sent_friend_requests, class_name: "FriendRequest", foreign_key: :sender_id
has_many :received_friend_requests, class_name: "FriendRequest", foreign_key: :receiver_id
def friends
sender_ids = "(SELECT sender_id FROM friend_requests WHERE receiver_id = :user_id AND confirmed)"
receiver_ids = "(SELECT receiver_id FROM friend_requests WHERE sender_id = :user_id AND confirmed)"
User.where("id IN #{sender_ids} OR id IN #{receiver_ids}", user_id: id)
end
def friends_with?(user)
friends.include?(user)
end
def received_requests
FriendRequest.where("receiver_id = ? AND NOT confirmed", id)
end
def sent_requests
FriendRequest.where("sender_id = ? AND NOT confirmed", id)
end
def received_from
User.where("id IN (?)", received_requests.pluck(:sender_id))
end
def sent_to
User.where("id IN (?)", sent_requests.pluck(:receiver_id))
end
def added?(user)
sent_to.include?(user)
end
def been_added_by?(user)
received_from.include?(user)
end
def befriend(user)
self.sent_friend_requests.create(receiver_id: user.id)
end
def unfriend(user)
friendship = FriendRequest.find_by(sender_id: id, receiver_id: user.id)
friendship ||= FriendRequest.find_by(sender_id: user.id, receiver_id: id)
friendship.destroy
end
def feed
Post.where("creator_id IN (?)", friends.pluck(:id).push(id))
end
def relation_status(users)
relations = {}
users.map do |user|
relations[user.id] = FriendRequest.find_by(sender_id: id, receiver_id: user.id)
relations[user.id] ||= FriendRequest.find_by(sender_id: user.id, receiver_id: id)
end
relations
end
end
friend_request.rb
class FriendRequest < ActiveRecord::Base
belongs_to :sender, class_name: "User"
belongs_to :receiver, class_name: "User"
validates :sender_id, presence: true
validates :receiver_id, presence: true
default_scope -> { order(created_at: :desc) }
end
users_controller.rb
class UsersController < ApplicationController
before_action :logged_in_user, only: [:index, :edit, :update, :destroy]
before_action :set_user
before_action :authenticate_user!
def new
@user = User.new
end
def index
@users = User.all
@friendships = current_user.relation_status(@users)
end
def edit
@user = User.create( user_params )
end
def show
@user = User.friendly.find(params[:id])
@friendship = current_user.relation_status([@user])[@user.id]
end
private
def set_user
@user = User.friendly.find(params[:id])
end
end
Routes.rb
Rails.application.routes.draw do
resources :friend_requests, only: [:create, :destroy, :update]
end
CreateFriendRequests | Migration file
class CreateFriendRequests < ActiveRecord::Migration
def change
create_table :friend_requests do |t|
t.boolean :confirmed, default: false
t.references :sender, references: :users
t.references :receiver, references: :users
t.timestamps
end
add_index :friend_requests, :sender_id
add_index :friend_requests, :receiver_id
add_index :friend_requests, [:sender_id, :receiver_id], unique: true
end
end
rake routes in console
FriendRequest
=> FriendRequest(id: integer, confirmed: boolean, sender_id: integer, receiver_id: integer, created_at: datetime, updated_at: datetime)
Aucun commentaire:
Enregistrer un commentaire