2017-06-14 87 views
1

我正在使用Rails和React。我有两个型号:scheduleworkerworker belongs_to scheduleschedule has_many workers。我想从反应中对rails进行更新请求。如何更新Rails中的所有关联模型?

这是fetch功能是什么样子,我用它来发送请求:

function updateSchedule(scheduleId, date, message, workersArray, cb){ 
    return fetch(`api/schedules/${scheduleId}`, { 
    method: 'PUT', 
    headers: { 
     'Content-Type': 'application/json' 
    }, 
    body: JSON.stringify({ 
     date: date, 
     message: message, 
     user_id: 1, 
     worker_info: workersArray 
    }) 
    }).then((response) => response.json()) 
    .then(cb); 
} 

workersArray的样本:

[{"id"=>54, "name"=>"Owen 
Johnston", "phone"=>"111-222-3333", "created_at"=>"2017-06-13T22:17:45.769Z", "updated_at"=>"2017-06-13T22:17:45.769Z", "schedule_id"=>33}, {"id"= 
>55, "name"=>"Mary Watson", "phone"=>"123-456-7890", "created_at"=>"2017-06-13T22:17:45.778Z", "updated_at"=>"2017-06-13T22:17:45.778Z", "schedule_ 
id"=>33}] 

计划有日期,消息和USER_ID属性。附表还有一组特定的工作人员。每名工人都有一个namephone。简而言之,在特定的时间表上,我想更新时间表的属性,包括其中的所有工作人员姓名和电话。我有问题遍历所有属于该时间表的工作人员并更新每个工作人员的参数。

这是一般的想法。我有问题使update方法工作。

def update 
    @schedule = Schedule.find(params[:id]) 
    if @schedule.update_attributes(schedule_params) 
     worker_params["worker_info"].each do |w| 
     @worker = Worker.find(w.id) 
     @worker.update_attributes! 
     end 
     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.permit(worker_info: [:name, :phone]) 
    end 

如何发送一个PUT请求从反应轨并告诉Rails更新相关的进度计划和所有的工人呢?

+0

我没有看到任何从请求主体进来的'schedule_params'。 –

回答

0

尽管我发现您发送给rails的内容存在差异,但我们假设您发送了正确的参数并能够更新时间表(但不包括工作人员)。这个差异是,你不发送您的PARAMS schedule关键,但它需要在这一行:

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

确保您的最终JSON(你要发送到轨)是这样的:

{ 
    "schedule": { 
    "date": "...your date", 
    "message": "...message", 
    "user_id": "...user_id" 
    } 
} 

即将到来的实际问题,我相信,无法更新工人。 Rails对于缓解你痛苦的模型有一个特别的指示。

在你Schedule模型,写:

accepts_nested_attributes_for :workers, allow_destroy: true 

这将使该模型来更新其子属性以及。这之后你的控制器需要改变一下。

def schedule_params 
    params.require(:schedule).permit(:date, :message, :user_id, workers_attributes: [:id, :name, :phone, :_destroy]) 
end 

然后使用@schedule.update_attributes(schedule_params)更新时间表,以及工人。

您的最终JSON应该是这样的:

{ 
    "schedule": { 
    "date": "...your date", 
    "message": "...message", 
    "user_id": "...user_id", 
    "workers_attributes": [{ 
     "id": 123, 
     "name: "...name", 
     "phone": "...phone" 
    }] 
    } 
} 

你可以通过工人的属性的数组,如果你想添加/更新/删除相关时间表工人将定义。在继续之前,您可能想了解更多关于accepts_nested_attributes_for的信息。