lundi 13 juillet 2015

undefined local variable or method `new_friend_requests_path'

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