我试图让用户将传入的好友请求的状态从“未接受”更改为“已接受”
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable
has_many :places
has_many :sent_friendships, class_name: "Friendship" , foreign_key: :sender_id
has_many :received_friendships, class_name: "Friendship", foreign_key: :receiver_id
class Friendship < ActiveRecord::Base
belongs_to :sender, class_name: "User"
belongs_to :receiver, class_name: "User"
end
<h1>Incoming Friend Requests</h1>
<% current_user.received_friendships.each do |friendship| %>
<%= friendship.sender.name %>
<%= link_to "Accept", user_accept_path(current_user), class: 'btn btn-success', method: :post %>
<% end %>
class FriendshipsController < ApplicationController
def accept
@user = User.find(params[:user_id])
end
end
我在哪里遇到绊脚石,因为我不确定如何最好地在发件人ID和接收者ID中加上友谊模型表上的正确行。
感谢任何帮助。
答案 0 :(得分:1)
您的accept
方法基本上应该做一组事情:
devise
可以在控制器中访问current_user
帮助方法)received_friendship
以了解哪位特定用户将成为current_user
的新朋友friendship
对象(从步骤2开始),将acceptance
(或您命名的任何内容)属性设置为accepted
。如您所知,第一步不需要您进行任何编码。第二个应该像根据友谊请求的sender_id
(或特定id
的{{1}})设置本地(或@instance)变量一样简单,这将更好。最后一个看起来像
friendship
还有一个提示:请注意,您的接受链接未传递步骤2中所需的数据:
friendship.acceptance = "accepted"
if friendship.save
# TODO: redirect to somewhere with a successful notice
else
# TODO: render users/show template once again with an error
end
答案 1 :(得分:1)
由于您的每个控制器都可以访问current_user
变量,因此您不能将其作为参数传递,但您应该将friendship.sender
传递给它。
然后,根据您的路线和架构,您可以执行以下操作之一:
创建新的Frienship
类FriendshipsController&lt; ApplicationController中
def accept
@user = User.find(params[:id])
friendship.create sender_id: current_user.id, reciever_id: @user.id
# or
# friendship.create sender_id: current_user.id, reciever_id: params[:id]
# then rdictect to somewhere
redirect ...
end
端
如果您在Frienship模型中有其他字段,例如 - 已接受,您可以更新。然后你会在发送友谊时找到一个创建的Frienship模型 邀请并更新该领域。
类FriendshipsController&lt; ApplicationController中
def accept
@user = User.find(params[:id])
friendship = Frienship.where("sender_id = ? and reciever_id = ?",
# sender was passed as an argument to link_to in the view
@user.id, current_user.id)
friendship.accept = true
friendship.save!
# then rdictect to somewhere
redirect ...
end
端