所以我在我的Rails应用程序中有一个User
模型(不是我们所有人?:D)。用户可以添加好友。
我按照这里给出的答案:Model design: Users have friends which are users
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
答案 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
虽然,我稍后需要重构这个逻辑,以便在实际连接之前包含朋友邀请/请求。