mercredi 15 juillet 2015

How do I get the number of friends to show up?

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