私は従業員のタイムカードを処理するアプリに取り組んでおり、従業員が特定の時間枠内ですべてのパンチを編集できるフォームを作成しようとしています。この RailsCastをフォームの基盤として使用したところ、問題なく起動して実行することができました。
class BlocksController < ApplicationController
def update
    @block = Block.find_by_id(params[:id])
    @punches = @block.punches
    keys = params[:punches].keys
    values = keys.map { |k| params[:punches][k] }
    @punches = Punch.update(keys, values).reject { |p| p.errors.empty? }
    if @punches.empty?
      flash[:notice] = "Punches updated"
      redirect_to employee_timecard_path(current_user, @block.timecard)
    else
      render :action => "edit"
    end
  end
ただし、問題は、ユーザーが意味をなさない方法でパンチを編集していないことを検証できる必要があることです (たとえば、出勤パンチを退勤パンチより遅くするなど)。またはその逆)。
カスタム モデルの検証を通じてこれを実行しようとしましたが、検証を通過する個々のモデルは他の値が更新されていることを認識していないため、バッチの最初のパンチは新しい値を他の更新前の値と比較しています。
私が考えることができる唯一の他のアプローチはparams[:punches]、コントローラーの更新メソッドに送信されることをループすることでしたが、これは「脂肪モデル、スキニーコントローラー」の慣習に反するようです。
ケーキを持って食べられる方法はありますか?どんな提案でも大歓迎です。