Search code examples
ruby-on-railsrubyruby-on-rails-3ruby-on-rails-3.1

Rails friendship canceling, decline


I am trying to build a friendship system sorta following this link: How to Implement a Friendship Model in Rails 3 for a Social Networking Application?. However lack a bit. I was able to create a relationship however i am not to sure on how to perform the following actions: cancel, decline, accept.

So lets say i try to cancel the relationship i do the following on the pending, to call the actions i do the follow:

<% @customer.pending_friends.each do |pf| %>
  <%= link_to pf.incomplete_name, cancel_friendships_path(:friend_id => pf), :method => :post  %><br />
<% end %>

Here the controller of cancel

  def cancel
    @customer = current_customer
    @friend = Customer.find(params[:friend_id])
    if @customer.pending_friends.include?(@friend)
      Friendship.breakup(@customer, @friend)
      flash[:notice] = "Friendship Canceled"
    else
      flash[:notice] = "No Friendship request"
    end
    redirect_to root_url
  end

and here my breakup function

  # Delete a friendship or cancel a pending request.
  def self.breakup(customer, friend)
    transaction do
      destroy(find_by_customer_id_and_friend_id(customer, friend))
      destroy(find_by_customer_id_and_friend_id(friend, customer))
    end
  end

I am however getting a no route errors when clicking on the cancel links. What i am doing wrong??

Here on the request

route.rb

resources :friendships do
    collection do
      get 'cancel'
      get 'decline'
    end
  end
  resources :friendships

rake routes

          cancel_friendships GET    /friendships/cancel(.:format)                        friendships#cancel
         decline_friendships GET    /friendships/decline(.:format)                       friendships#decline
                             GET    /friendships(.:format)                               friendships#index
                             POST   /friendships(.:format)                               friendships#create
                             GET    /friendships/new(.:format)                           friendships#new
                             GET    /friendships/:id/edit(.:format)                      friendships#edit
                             GET    /friendships/:id(.:format)                           friendships#show
                             PUT    /friendships/:id(.:format)                           friendships#update
                             DELETE /friendships/:id(.:format)                           friendships#destroy

/********************************************************/


                 friendships GET    /friendships(.:format)                               friendships#index
                             POST   /friendships(.:format)                               friendships#create
              new_friendship GET    /friendships/new(.:format)                           friendships#new
             edit_friendship GET    /friendships/:id/edit(.:format)                      friendships#edit
                  friendship GET    /friendships/:id(.:format)                           friendships#show
                             PUT    /friendships/:id(.:format)                           friendships#update
                             DELETE /friendships/:id(.:format)                           friendships#destroy

Solution

  • The problem is that in your routes you have:

    get 'cancel'
    

    but your cancel-link is doing a post request, not a get:

    <%= link_to ..., ..., :method => :post %>
    

    Personally I think it should be a delete request.

    In your routes:

    delete 'cancel'
    

    In your view:

    <%= link_to pf.incomplete_name, cancel_friendships_path(:friend_id => pf), :method => :delete %>
    

    Your code may have other problems, but this is one thing you have to fix.