【发布时间】:2020-05-02 17:11:00
【问题描述】:
我有一个带有控制器的 Rails API,该控制器在 create 函数上有一个 before_action,用于检查创建“粘贴”的 current_user 是否也是 paste_params 中指定 room_id 的所有者。
如果未找到 current_user.rooms.find(params[:paste][:room_id]).user_id 或找到但不等于 current_user.id,则服务器始终返回 404。
如何让它返回 403 而不是 404?因为此检查旨在确定创建粘贴的用户是否也是粘贴将链接到的房间的所有者,如果用户不是该房间的所有者,则意味着他们无权在下创建粘贴那个房间。
这是控制器的相关部分:
class Api::V1::PastesController < ApplicationController
before_action :check_room_owner, only: %i[create update destroy]
def create
paste = current_user.pastes.build(paste_params)
if paste.save
render json: PasteSerializer.new(paste).serializable_hash, status: :created
else
render json: { errors: paste.errors }, status: :unprocessable_entity
end
end
private
# Convert to 403 forbidden if not found
def check_room_owner
head :forbidden unless current_user.rooms.find(params[:paste][:room_id]).user_id === current_user.id
end
end
干杯!
【问题讨论】:
-
这个问题的实际minimal reproducible example 将是 11 行,而不是 48 行。我建议花点时间阅读那篇文章。很多时候,自己创建 MRE 会引导您找到解决方案。
标签: ruby-on-rails ruby api controller