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,然后再实际将它们连接起来。
所以我的 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,然后再实际将它们连接起来。