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

Rails User add friend through HTTP request

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

我正在关注此处给出的答案:

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 请求的参数是什么来告诉我的用户 "friend" id 是某个数字,我的用户更新操作应该找到使用给定朋友 id 的其他用户并添加该用户作为第一个用户的朋友。

不过,我能够使用 rails console --sandbox 通过创建两个用户成功添加朋友,然后使用此代码:

jim.friends << sarah

这如预期的那样将 Sarah 添加为 Jim 的朋友,这让我相信我的 table 关系是...半...工作?

有什么想法吗? :D

我决定使用不同的方法并创建了一个名为 "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

尽管如此,我稍后需要重构此逻辑以包含朋友 invite/requests,然后再实际将它们连接起来。