Rails用户通过HTTP请求添加好友

时间:2016-11-20 14:10:32

标签: ruby-on-rails associations foreign-key-relationship

所以我在我的Rails应用程序中有一个User模型(不是我们所有人?:D)。用户可以添加好友。

我按照这里给出的答案:Model design: Users have friends which are users

User.rb

class User < ApplicationRecord
  ...
  has_and_belongs_to_many :friends,
    class_name: "User",
    join_table: :friends_users,
    foreign_key: :user_id,
    association_foreign_key: :friend_id

  ...
end

我使用以下方式生成了我的迁移文件:

rails generate CreateFriendshipJoinTable users friends

生成的迁移文件经过一些修改:

迁移文件

class CreateFriendshipsJoinTable < ActiveRecord::Migration[5.0]
  def change
    create_join_table :users, :friends do |t|
      t.index [:user_id, :friend_id]
      t.index [:friend_id, :user_id]
    end
  end
end

更新操作

def update
    user = User.find_by({id: params[:id]})

    skip_authorization and render status: :not_found and return unless user

    authorize user

    attributes = policy(User).permitted_attributes_for_update

    if user.update_attributes!(params.permit(attributes))
        render json: user
    else
        render status: :unprocessable_entity
    end
end

测试

  test "user friends - should successfully add a friend" do
    put user_path(@jim), params: {user_id: @sarah.id}, headers: user_authenticated_header(@jim)
    assert_response :success

    json = JSON.parse(response.body)
    puts "json = #{json}"

    user = User.find_by({id: @jim.id})
    assert_includes user.friends, @sarah
  end

我的测试失败了。

我不确定HTTP PUT请求的参数是告诉我的用户&#34;朋友&#34; id是一些数字,我的用户更新操作应该使用给定的朋友ID找到其他用户,并将该用户添加为第一个用户的朋友。

但是,我可以通过创建两个用户,然后使用此代码成功地使用rails console --sandbox来添加朋友:

jim.friends << sarah

这增加了莎拉作为吉姆的朋友的预期,这让我相信我的餐桌关系......一半......工作?

任何想法? :d

1 个答案:

答案 0 :(得分:0)

我决定使用不同的方法并创建一个名为“add_friend”的新动作:

def add_friend
  friend = User.find_by({id: params[:id]})

  skip_authorization and render status: :not_found and return unless friend

  authorize friend

  current_user.friends << friend
  friend.friends << current_user

  if current_user.save! && friend.save!
    render json: current_user, status: :ok
  else
    render status: :bad_request
  end
end

我的测试现在正在通过,我的用户Jim有一个朋友Sarah:D

虽然,我稍后需要重构这个逻辑,以便在实际连接之前包含朋友邀请/请求。