我是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
答案 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字段