ruby-on-rails - 在rails api中制作所需的参数
问题描述
我有一个接受三个参数的控制器title
,users
和project_type
。我想制作所需的所有参数
我见过人们做类似的事情
def project_params
params.require(:title,:project_type, :users)
.permit(:title, :project_type, :users)
end
然后做Project.new(project_params)
,但我需要先处理一下参数。我怎样才能做到这一点?
我在邮递员中发出这样的帖子请求:
module Api
module V1
class ProjectsController < ApplicationController
def create
admins = params[:admins]
users = get_user_array()
project_type = ProjectCategory.find_by(name: params[:project_type])
project = Project.new(
title: params[:title],
project_category: project_type,
project_users: users)
if project.save
render json: {data:project}, status: :ok
else
render json: {data:project.errors}, status: :unprocessable_entity
end
end
...
end
end
end
{
"title": "Tennis",
"project_type": "Sports",
"users": [{"name": "john Dow", "email": "johnDoe@gmail.com"}],
}
解决方案
我会说你用ActionController::Parameters#require
错了。它并不是要验证是否存在所有必需的属性——这就是模型验证的用途。相反,您应该只使用params.require
以确保参数的一般结构是可处理的。
例如,如果您使用 rails 脚手架,您将获得以下白名单:
params.require(:project)
.permit(:title, :project_type)
这是因为如果参数散列中缺少密钥,则继续执行没有意义,project
因为这会给您一个空散列或 nil。
ActionController::Parameters#require
将引发一个ActionController::ParameterMissing
错误,该错误将返回一个400 - Bad Request
响应,该响应是您正在执行的错误响应代码。您也不应该对正常的应用程序流程使用异常。缺少属性不是异常事件。
相反,如果您想使用平面参数哈希,您应该将其列入白名单:
def project_params
params.permit(:title, :project_type, users: [:name, :email])
end
推荐阅读
- c# - 如何避免超时并执行存储过程 Azure SQL 数据库
- javascript - 如何使用扩展运算符更新对象
- php - 无法将时间戳从表单数据保存到 sql 数据库
- algorithm - 如何为最小生成树增加弹性?
- powershell - 实现“按 Enter 跳过”
- python-3.x - 使用 exchangelib 访问 Outlook Exchange 服务器以阅读电子邮件时出现错误 403
- reactjs - 列出不呈现数据
- wordpress - 如何查找和编辑自定义端点。在 wordpress 中休息 api
- javascript - ReactJS - 关于动态路由的问题
- react-native - 键盘覆盖屏幕的一半