无法更新 rails 控制器中更新操作的关系

Cant update relations on Update action in rails controller

更新名为 Jobs 的资源时我想将此更新中的一些值复制到连接到此资源的一些资源

Jobs 有很多小时,每个小时有一个周期,有 2 组时间。因此,如果我用这些时间更新作业,我希望将它们复制到期间

我在不同的变体中尝试了这段代码,但是期间实体没有得到更新。

  def update
@job = Job.find(params[:id])

respond_to do |format|
  if @job.update_attributes(params[:job])

    @job = Job.find(params[:id])

    @job.hours.each do |hour|
      logger.debug params[:job][:start1]
      logger.debug params[:job][:end1]
      hour.periods.first.start_time = params[:job][:start1]
      hour.periods.first.end_time = params[:job][:end1]
      hour.periods.last.start_time = params[:job][:start2]
      hour.periods.last.end_time = params[:job][:end2]
    end

    @job.save

    format.html { redirect_to @job, notice: 'Job was successfully updated.' }
    format.json { head :no_content }
  else
    format.html { render action: "edit" }
    format.json { render json: @job.errors, status: :unprocessable_entity }
  end
end

结束

这应该让您更接近于判断是哪个代码失败了,但是您可能会在那里遇到各种各样的问题。如果这不起作用,请取消注释 binding.pry 并确保 hour 属性已更新 另外,看起来你得到了两次 @job?试一试:

def update
  @job = Job.find(params[:id])
  respond_to do |format|
    if @job && @job.update_attributes(params[:job])
      logger.debug "Job updated attributes"
      @job.hours.each do |hour|
        hour.periods.first.update_attributes(start_time: params[:job][:start1])
        hour.periods.first.update_attributes(end_time: params[:job][:end1])
        hour.periods.last.update_attributes(start_time: params[:job][:start2])
        hour.periods.last.update_attributes(end_time: params[:job][:end2])
        # binding.pry
      end

      @job.save!

      format.html { redirect_to @job, notice: 'Job was successfully updated.' }
      format.json { head :no_content }
    else
      format.html { render action: "edit" }
      format.json { render json: @job.errors, status: :unprocessable_entity }
    end
  end
end

您可以通过在周期记录上调用 update_column 来稍微加快更新速度。即 hour.periods.first.update_column(:start_time, params[:job][:start_time]),但这样做会丢失对周期模型的任何验证或回调。