![](/img/trans.png)
[英]How can I create a model's object from a different model with some common properties/attributes in Rails?
[英]How to get attributes from array of objects to create different model in Rails?
我有一个在后台运行的Rails服务器,用于捕获API请求。 在Rails内部,我有2个关联的模型: schedule
和worker
。 schedule has_many workers
and worker belongs_to schedule
我正在从React(fetch method)发出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}
})
在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
)。
Schedule本身具有date, message,
和user_id
属性。 工人具有name
和phone
属性。 我的计划是仅向Rails发出一个请求,对一些工作程序信息进行存根,然后让Rails在Schedule中创建工作程序对象。 同样,我可以使用上面的代码来做到这一点。
我的问题是,在复杂性增加,而不是一个单一的对象,当我尝试发送, worker_info
,数组worker_infos
。
worker_info: [{name: workerName, phone: phone}]
(将来,我想发送可变数量的worker,这就是为什么我添加数组的原因。现在,我只需要使其与一个数组一起工作即可)
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_info: [{name: workerName, phone: phone}]
创建新的Worker对象?
老兄
首先,在'ya上避免使用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
您可能希望将一些垃圾包装在事务中,以防万一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.