如何从对象数组中获取属性以在Rails中创建不同的模型?

时间:2017-05-26 00:35:55

标签: ruby-on-rails api

我在后台运行一个用于捕获API请求的Rails服务器。在Rails中,我有2个关联模型:scheduleworkerschedule has_many workersworker belongs_to schedule

我正在从React(获取方法)发出POST请求,这就是React的样子:

  return fetch(`api/schedules`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      date: date,
      message: message,
      user_id: 1,
      worker_info: {name: workerName, phone: phone}
    })

On Rails schedules_controller:

  def create
    @schedule = Schedule.new(schedule_params)
    @worker = @schedule.workers.new(worker_params)
    @worker.save
    if @schedule.save
      render json: @schedule
    else
      render json: @schedule, status: :unprocessable_entity
    end
  end

  ...

  def schedule_params
    params.require(:schedule).permit(:date, :message, :user_id)
  end

  def worker_params
    params.require(:worker_info).permit(:name, :phone)
  end

请注意,上面的代码可以正常使用

我想向api/schedules发送几个参数:date, message, user_id和一些工作人员信息(name, phone)。

计划本身包含属性date, message,user_id。工作人员具有namephone属性。我的计划是只向Rails发出 一个 请求,存根一些工作人员信息,并让Rails在Schedule中创建工作者对象。我再次使用上面的代码可以做到这一点。

我的问题是,当我尝试发送worker_info数组而不是单个对象worker_infos时,复杂性会增加。

worker_info: [{name: workerName, phone: phone}]

(将来,我想发送可变数量的工作人员,这就是我添加数组的原因。现在,我只需要让它只使用一个)

worker_info: [{name: 'Test Worker 1', phone: '12345'}, {name: 'Test Worker 2', phone: '54321'}, ...]

如果添加数组[],我无法弄清楚如何提取工作人员信息来创建工作者对象。这是rails服务器错误:

Started POST "/api/schedules" for 127.0.0.1 at 2017-05-25 17:19:32 -0700
Processing by SchedulesController#create as */*
  Parameters: {"date"=>"2017-05-27T02:00:00.000Z", "message"=>"Mireya Hiya~!!", "user_id"=>1, "worker_info"=>[{"name"=>"Mireya How
e", "phone"=>"1234567890"}], "schedule"=>{"date"=>"2017-05-27T02:00:00.000Z", "user_id"=>1, "message"=>"Hello test!!"}}
Completed 500 Internal Server Error in 11ms (ActiveRecord: 0.0ms)



NoMethodError (undefined method `permit' for #<Array:0x007f8381fd2530>):

app/controllers/schedules_controller.rb:59:in `worker_params'
app/controllers/schedules_controller.rb:20:in `create'

我正在避免Rails'accept_nested_attributes_for方法,因为我的其他代码的结构方式,它不会起作用,并且已经引起了很大的麻烦。

如何在worker_info: [{name: workerName, phone: phone}]中提取信息并使用它创建新的Worker对象?

1 个答案:

答案 0 :(得分:1)

何,伙计。

首先,擅长避免accept_nested_attributes_for。什么是集群你知道什么。

因此,strong parameters的重点是能够在进行大规模分配时将内容列入白名单。这看起来并不像是一个质量分配情况,所以我会放弃整个方法。

相反,我会裸露指关节。你知道,比如:

app/services/api/schedules/workers_service.rb

class Api::Schedules::WorkersService

  class < self

    def call(params={})
      ...
      # do a bunch of clever stuff
      ...
    end

  end
end

然后在SchedulesController中,执行以下操作:

def create
  @schedule = Schedule.new(schedule_params)
  if @schedule.save
    Api::Schedules::WorkersService.call(
      schedule_id: @schedule.id,
      worker_info: params[:worker_info]
    )
    render json: @schedule
  else
    render json: @schedule, status: :unprocessable_entity
  end
end

你可能想要在交易中包装一些垃圾,以防事情发生在南方。