其他变化时如何更新一个属性

时间:2018-11-27 10:11:58

标签: ruby-on-rails ruby ruby-on-rails-5

我是Rails的新手,可以做到这一点。

在“完成”变为true时尝试更新“ completed_at”。

我已阅读:https://api.rubyonrails.org/classes/ActiveModel/Dirty.html#method-i-changed-3F

并决定在每次更新或保存时添加一个回调。然后检查“完成”道具是否已更改,如果未更改,则为true,将“ completed_at”更新为当前日期。

方法“ check_is_completed”确实被调用,但是我无法访问正确的道具并检测是否已更改并获取新值

class Task < ApplicationRecord
  belongs_to :user
  validates :name, presence: true

  after_save :check_is_completed
  after_update :check_is_completed

  private 

  # This gets called
  def check_is_completed
    # try 1
    # This does not work called
    if @completed.changed?
      if @completed == true
      self.completed_at = Date.new()
      end
    end
    #try 2
    if self.completed_changed?
      if self.completed == true
      self.completed_at = Date.new()
      end
    end
  end
end

1 个答案:

答案 0 :(得分:2)

您几乎在那里。您的问题是您在保存之后而不是之前执行检查。保存记录后,更新已经完成,因此系统认为没有任何更改。

更改

  after_save :check_is_completed
  after_update :check_is_completed

收件人

  before_save :check_is_completed

您也将不需要使用任何实例变量。由于您已经在上课,所以您要做的就是:

def check_is_completed
  return unless completed_changed?
  self.completed_at = Date.new() if completed?
end

这将在每次保存之前执行检查,除非完成的属性已更改,否则不执行任何操作,然后仅在完成为true时才更新completed_at字段