0

所以,我有更新数据库中记录的表格。在我的控制器update操作中,如果另一个值是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

我关心的表单的唯一值是statusand estimate_sent_date。大多数情况下,我只是不确定如何更改该记录的值estimate_sent_date并保存该记录。

另外,我应该保存所有内容,然后单独调用保存estimate_sent_date还是一次保存所有内容?estimate_sent_date我想我可以在调用之前更改的值if @invoice.update_attributes(params[:invoice]),不是吗?

谢谢您的帮助!

4

3 回答 3

5

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

before_save :set_sent_date

def set_sent_date
  if self.status_changed? && self.status == "Estimate"
     self.estimate_sent_date = Time.now
  end
end
于 2012-11-05T03:07:26.160 回答
2

我会在您的 Invoice 模型中移动这种业务逻辑。这是 :before_save 回调的典型用例

于 2012-11-05T03:07:45.127 回答
1

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

after_transition :to => :estimate do |invoice|
  invoice.estimate_sent_date = Time.now
end
于 2012-11-05T03:03:49.823 回答