首页 > 解决方案 > 如果某个值为空,如何从强参数中删除特定对象

问题描述

我正在构建一个 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" => ""
    }]
}
}

标签: ruby-on-rails

解决方案


你可以这样做:

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

推荐阅读