Ruby on rails Rails 3-如何在更新保存之前更改控制器中的属性?

Ruby on rails Rails 3-如何在更新保存之前更改控制器中的属性?,ruby-on-rails,controller,Ruby On Rails,Controller,所以,我有一个表单更新数据库中的记录。在我的控制器更新操作中,如果另一个值为Estimate,我希望将一个值更改为其他值。也许这会更有意义…这就是我想做的 def update @invoice = Invoice.find(params[:id]) if @invoice.update_attributes(params[:invoice]) if@invoice.status == "Estimate" # if the value o

所以,我有一个表单更新数据库中的记录。在我的控制器更新操作中,如果另一个值为Estimate,我希望将一个值更改为其他值。也许这会更有意义…这就是我想做的

def update
    @invoice = Invoice.find(params[:id])
    if @invoice.update_attributes(params[:invoice])
        if@invoice.status == "Estimate"
            # if the value of status is Estimate then change the
            # value of estimate_sent_date to the current timestamp
        end
        redirect_to invoices_path
    else
        render 'edit'
    end
end
我关心的表单的唯一值是状态和估计发送日期。大多数情况下,我只是不知道如何更改estimate_sent_date的值并保存该记录

另外,我应该保存所有内容,然后单独调用以保存估计发送日期,还是一次保存所有内容?我想我可以在调用if@invoice.update\u attributesparams[:invoice]之前更改estimate\u sent\u date的值,不是吗


谢谢你的帮助

听起来你想在这里重新发明一台状态机。我建议查看state_machine gem,然后使用它实现发票转换为“估计”状态后发生的事件,将其放入state_machine定义中,该定义将进入您的模型中:

after_transition :to => :estimate do |invoice|
  invoice.estimate_sent_date = Time.now
end

正如Ryan Bigg所说,状态机在这里工作。另一种解决方案是在发票模型上使用before_save回调,如下所示:

before_save :set_sent_date

def set_sent_date
  if self.status_changed? && self.status == "Estimate"
     self.estimate_sent_date = Time.now
  end
end

我会在您的发票模型中移动这种业务逻辑。这是a:before_save callback的典型用例

我想我会把它放在我的模型中吗?是的,这个放在模型中。保持控制器瘦身的良好实践!更新了答案,以反映代码应该进入模型。谢谢!这可能是我最好的路线。state_machine gem看起来很有趣,但它可能比我需要的更多,因为这只是一个个人应用程序。是的,state_machine有时会被过度使用。在此了解有关活动记录回调的更多信息:可能是状态机gems中的“新酷”。它似乎是主动维护的,而状态机似乎已废弃。请在回答问题时提供示例。