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.
问题是如果我这样做,delete方法将删除最后添加的关系,而不是链接到ignore按钮的关系。
Let's work with an example: Here is the relationship I would like to destroy: User_id: 10 Friend_id: 6 Friendship_id: 18
让我们举个例子:这是我想破坏的关系: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:
我在用户的“显示”页面(个人资料)上,其user_id是6.我看到用户10发出了我想忽略的朋友请求。即使我设法提取正确的Friendship_id,执行:
<%= link_to "Ignore", friendship_path(Friendship_id), :controller => :friendships, :method => :delete %>)
It results in "Cannot find Friendships with ID=18[where user_id=6]"
导致“无法找到ID = 18 [其中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 ?
在这种情况下,有谁知道如何在正确的关系上调用destroy动作?或者我应该采取不同的行动
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:
编辑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...).
用户A向用户B发送朋友请求(A =用户,B =该类实例中的朋友)。如果B接受请求,则创建另一个实例(B =用户,A =朋友)。如果存在关系A-> B和B-> A,则A是B的朋友。否则,请求保持挂起(或者可以忽略,拒绝......)。
1 个解决方案
#1
1
I'm editing my whole answer because I think I found the gist of your problem. When a user tries to be friends with someone, you add a relationship to that user but you don't add it to the other user. SO, current_user.friendships.find(params[:id])
expects the current_user to have a friendship with that id but that relationship doesn't belong to him, but to the other user.
我正在编辑我的整个答案,因为我认为我找到了问题的要点。当用户尝试与某人成为朋友时,您会向该用户添加关系,但不会将其添加到其他用户。 SO,current_user.friendships.find(params [:id])期望current_user与该id具有友谊,但该关系不属于他,而是属于其他用户。
I'm not sure if I made it clear enough, but here's my 2nd try:
我不确定我是否说得够清楚,但这是我的第二次尝试:
Your link should be:
你的链接应该是:
<%= link_to "Ignore", friendship_path(:id => friendship_id, :friend_id => user.id), :method => :delete %>)
And then your action:
然后你的行动:
def destroy
potential_friend = User.find(params[:friend_id])
friend_request = potential_friend.friendships.find(params[:id])
friendship = current_user.friendships.find_by_friend_id(potential_friend.id)
if friendship.nil? #Users are not friends and you want to delete the friend request
friend_request.destroy
flash[:notice] = "Removed friend request."
else #Users are friends and you want to delete the friendship
friendship.destroy
friend_request.destroy
flash[:notice] = "Removed friendship."
end
redirect_to current_user
end
I'm not sure if you should turn this into custom action. As you can see, it does much more than just destroy a single object.
我不确定你是否应该把它变成自定义动作。正如您所看到的,它不仅仅是销毁单个对象。
#1
1
I'm editing my whole answer because I think I found the gist of your problem. When a user tries to be friends with someone, you add a relationship to that user but you don't add it to the other user. SO, current_user.friendships.find(params[:id])
expects the current_user to have a friendship with that id but that relationship doesn't belong to him, but to the other user.
我正在编辑我的整个答案,因为我认为我找到了问题的要点。当用户尝试与某人成为朋友时,您会向该用户添加关系,但不会将其添加到其他用户。 SO,current_user.friendships.find(params [:id])期望current_user与该id具有友谊,但该关系不属于他,而是属于其他用户。
I'm not sure if I made it clear enough, but here's my 2nd try:
我不确定我是否说得够清楚,但这是我的第二次尝试:
Your link should be:
你的链接应该是:
<%= link_to "Ignore", friendship_path(:id => friendship_id, :friend_id => user.id), :method => :delete %>)
And then your action:
然后你的行动:
def destroy
potential_friend = User.find(params[:friend_id])
friend_request = potential_friend.friendships.find(params[:id])
friendship = current_user.friendships.find_by_friend_id(potential_friend.id)
if friendship.nil? #Users are not friends and you want to delete the friend request
friend_request.destroy
flash[:notice] = "Removed friend request."
else #Users are friends and you want to delete the friendship
friendship.destroy
friend_request.destroy
flash[:notice] = "Removed friendship."
end
redirect_to current_user
end
I'm not sure if you should turn this into custom action. As you can see, it does much more than just destroy a single object.
我不确定你是否应该把它变成自定义动作。正如您所看到的,它不仅仅是销毁单个对象。