在Ruby

时间:2015-06-07 19:35:14

标签: ruby-on-rails ruby

我试图让用户将传入的好友请求的状态从“未接受”更改为“已接受”

用户模型

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中加上友谊模型表上的正确行。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您的accept方法基本上应该做一组事情:

  1. 获取接受请求的用户(您应该已经为此完成此操作,因为devise可以在控制器中访问current_user帮助方法)
  2. 获取相应的received_friendship以了解哪位特定用户将成为current_user的新朋友
  3. 更新friendship对象(从步骤2开始),将acceptance(或您命名的任何内容)属性设置为accepted
  4. 如您所知,第一步不需要您进行任何编码。第二个应该像根据友谊请求的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传递给它。

然后,根据您的路线和架构,您可以执行以下操作之一:

  1. 创建新的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
    

  2. 如果您在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