我有一个控制器,它接受三个参数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"}],
}
答案 0 :(得分:1)
我认为,如果您不必从前端获得任何东西来运行get_user_array()
,则只能允许并要求title
和project_type
。
def create
users = get_user_array()
project = Project.new(project_params)
project.users = users
if project.save
render json: {data:project}, status: :ok
else
render json: {data:project.errors}, status: :unprocessable_entity
end
end
private
def project_params
params.require(:project).permit(:title, :project_type).tap do |project_params|
project_params.require(:title, :project_type)
end
end
如果您需要在创建项目之前进行处理,则可以执行以下操作:
project_category = ProjectCategory.find_by(name: project.project_type)
答案 1 :(得分:1)
我会说您使用的是ActionController::Parameters#require
错误。它并不是要验证是否存在所有必需的属性-那就是model validations的含义。相反,您应该只使用params.require
来确保参数的常规结构是可处理的。
例如,如果您使用了rails脚手架,您将获得以下白名单:
params.require(:project)
.permit(:title, :project_type)
这是因为如果params哈希中缺少project
键,则继续执行没有意义,因为这会给您一个空哈希或nil。
ActionController::Parameters#require
将引发ActionController::ParameterMissing
错误,该错误将返回400 - Bad Request
响应,这是您正在执行的错误响应代码。您也不应在正常的应用程序流程中使用异常。缺少属性不是例外事件。
相反,如果您想使用平面参数散列,则应将其列入白名单:
def project_params
params.permit(:title, :project_type, users: [:name, :email])
end