I have the traditional friendship model:
The user model has:
has_many :friendships, :dependent => :destroy
has_many :friends, :through => :friendships, :dependent => :destroy
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id", :dependent => :destroy
has_many :inverse_friends, :through => :inverse_friendships, :source => :user, :dependent => :destroy
I would like to define the status "friend" only if a friend request has been sent, and accepted by the other user. Everything works fine except that I did not manage to process the "ignore friend request" part.
What I am trying to do is: on a user profile page, there's a list of requests from other user, waiting approval. The user can then accept a friend request (then it becomes a friend) or reject it (then the friendship relationship is destroyed).
Here is the piece of code, in the friendship controller, when it blocks:
<h2 class="small_v_space">Waiting your approval</h2>
<ul>
<% for user in @user.inverse_friends %>
<% if user.friends.exists?(@user) and not @user.friends.exists?(user) %>
<li>
<%=h user.name %>
(<%= link_to "Accept", friendships_path(:friend_id => user), :method => :post %>,
<%= link_to "Ignore", friendship_path, :controller => :friendships, :method => :delete %>)
</li
<% end %>
<% end %>
</ul>
The problem is that if I do like this, the delete method will delete the last added relationship, instead of the one linked to the ignore button.
Let's work with an example: Here is the relationship I would like to destroy: User_id: 10 Friend_id: 6 Friendship_id: 18
I'm on the 'show' page (profile) of user, whose user_id is 6. I see that user 10 has made a friend request that I would like to ignore. Even if I managed to extract the proper Friendship_id, doing:
<%= link_to "Ignore", friendship_path(Friendship_id), :controller => :friendships, :method => :delete %>)
It results in "Cannot find Friendships with ID=18[where user_id=6]"
Does anyone know how I could call the destroy action on the right relationship in this case ? Or should I proceed differently ?
Many thanks for any clue!
EDIT
Destroy action of the friendship controller:
def destroy
@friendship = current_user.friendships.find(params[:id])
if @friendship.friend.friends.exists?(current_user)
@friendship.destroy
flash[:notice] = "Removed friendship."
else
@friendship.destroy
flash[:notice] = "Removed friend request."
end
redirect_to current_user
end
EDIT 2:
class Friendship
belongs_to :user
belongs_to: :friend, :class_name => 'User'
end
User A sends a friend request to user B (A=user, B=friend in the instance of the class). If B accepts the requests, then another instance is created (B=user, A=friend). If there exists both a relation A->B and B->A, A is a friend of B. Otherwise, the request remains pending (or can be ignored, rejected...).
<%= link_to "Ignore", friendship_path(Friendship_id), :method => :delete %>
should work, could you please show the destroy action of your friendships controller? – Gubernatorial