在Rails API中设置参数

时间:2019-07-12 18:48:43

标签: ruby-on-rails ruby

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

2 个答案:

答案 0 :(得分:1)

我认为,如果您不必从前端获得任何东西来运行get_user_array(),则只能允许并要求titleproject_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