0

だから、私はデータベースのレコードを更新するフォームを持っています。私のコントローラーupdateアクションでは、値の別の1つがである場合、値を何かに変更したいと思います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

私が関わっているフォームの唯一の値はとstatusですestimate_sent_dateestimate_sent_dateほとんどの場合、そのレコードの値を変更して保存する方法がわかりません。

また、すべてを保存してから、別の呼び出しを行って保存する必要がありますか、estimate_sent_dateそれとも一度にすべて保存する必要がありますか?estimate_sent_date電話をかける前にの値を変更できると思いif @invoice.update_attributes(params[:invoice])ますよね?

助けてくれてありがとう!

4

3 に答える 3

5

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
于 2012-11-05T03:07:26.160 に答える
2

この種のビジネスロジックを請求書モデルに移動します。これは:before_saveコールバックの典型的なユースケースです

于 2012-11-05T03:07:45.127 に答える
1

ここでステートマシンを再発明しようとしているようです。gemを調べて、state_machineそれを使用して、請求書が「推定」状態に移行した後に発生するイベントを実装し、これをstate_machineモデル内に入る定義内に配置することをお勧めします。

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