首页 > 解决方案 > 在rails api中制作所需的参数

问题描述

我有一个接受三个参数的控制器titleusersproject_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"}],
}

标签: ruby-on-railsruby

解决方案


我会说你用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

推荐阅读