ruby-on-rails - 如果某个值为空,如何从强参数中删除特定对象
问题描述
我正在构建一个 Rails 5 应用程序。我正在从我的 Angular 7 应用程序中发送一系列出席者属性。这些来自表单字段网格,我让用户在其中添加一整月的大量时间报告。我也让他们发送空的时间报告字段,但我只想保存已填写的时间报告。如何在保存到数据库之前从强参数中删除未设置 starts_at_time 的报告?
这是我的代码:
def report_params
params.permit(:title, :description, attendances_attributes: [:id, :timetype_id, :starts_at_date, :starts_at_time, :ends_at_date, :ends_at_time, :description, :hours, :minutes, :_destroy])
end
换句话说,我想检查报告参数中的出勤属性,其中starts_at_time 为空,并从数组/参数中删除该对象,然后将其保存到数据库中。我怎样才能做到这一点?
我试过这个,它什么也没做
def update
report_params['attendances_attributes'].each_with_index do |report, index|
unless report['starts_at_time']
report_params['attendances_attributes'].delete_at(index)
end
end
@report = Report.find params[:id]
if @report.update_attributes report_params
render "api/v1/reports/show"
else
respond_with @report
end
end
更新
这些是我的控制器参数
def report_params
params.permit(:title, :description, attendances_attributes: [:id, :timetype_id, :starts_at_date, :starts_at_time, :ends_at_date, :ends_at_time, :description, :hours, :minutes, :_destroy])
end
来自 Angular 的输入是:
{
"title" => "Report august", "description" => "", "attendances_attributes" => [{
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-01",
"starts_at_time" => "12:00",
"ends_at_date" => "2019-08-01",
"ends_at_time" => "14:00",
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-02",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-02",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-03",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-03",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-04",
"starts_at_time" => "08:00",
"ends_at_date" => "2019-08-04",
"ends_at_time" => "10:00",
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-05",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-05",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-06",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-06",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-07",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-07",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-08",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-08",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-09",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-09",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-10",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-10",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-11",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-11",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-12",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-12",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-13",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-13",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-14",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-14",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-15",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-15",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-16",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-16",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-17",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-17",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-18",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-18",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-19",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-19",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-20",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-20",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-21",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-21",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-22",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-22",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-23",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-23",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-24",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-24",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-25",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-25",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-26",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-26",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-27",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-27",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-28",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-28",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-29",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-29",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-30",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-30",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}, {
"id" => nil,
"otype" => nil,
"user_id" => nil,
"timetype_id" => nil,
"starts_at_date" => "2019-08-31",
"starts_at_time" => nil,
"ends_at_date" => "2019-08-31",
"ends_at_time" => nil,
"hours" => nil,
"minutes" => nil,
"description" => nil,
"break" => nil,
"_destroy" => ""
}]
}
}
解决方案
你可以这样做:
new_report_params = report_params.dig(:attendances_attributes).reject do |attendances_attribute|
attendances_attribute.dig(:starts_at_time).nil?
end
if @report.update_attributes new_report_params
render "api/v1/reports/show"
else
respond_with @report
end
推荐阅读
- python - Average of a series, skipping element[0]
- r - 带空括号的 dplyr::mutate_all 调用函数
- node.js - 在 localhost:4000 但不在 ec2-ip:4000 上运行
- go - 如何创建一个函数来接受来自任何结构的任何对象的任何调用?
- json - 如何从 google pagespeedinsights api json 数据中提取 loadingExperience 和 originLoadingExperience 时间和百分比?
- wordpress - 在 wordpress 的产品页面上添加下一个和上一个链接
- android - 跨活动的 SharedPreferences 在子片段中返回 null
- testing - 如何使用带有 LOCUST 或 GATLİNG 的集成 Windows 身份验证 Web 应用程序测试 ASP.NET
- html - 如何迭代json对象?
- r - 使用 R 中 ggplot2 中的 geom_bar 图在类别之间创建空间和垂直线