1

私は従業員のタイムカードを処理するアプリに取り組んでおり、従業員が特定の時間枠内ですべてのパンチを編集できるフォームを作成しようとしています。この 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]、コントローラーの更新メソッドに送信されることをループすることでしたが、これは「脂肪モデル、スキニーコントローラー」の慣習に反するようです。

ケーキを持って食べられる方法はありますか?どんな提案でも大歓迎です。

4

1 に答える 1

0

私は同様の問題に苦しんでいます:

  1. スケジュールには開始日と終了日があります
  2. スケジュールが重なってはいけない

これが私が結論付けたものです:

ここでは、2 種類の有効性が行われています。

  1. 個々のモデルの妥当性 (例: 開始日は存在しますか?)
  2. モデルのコレクションの妥当性 (例: 重複するインスタンスのペアはありますか?)

個々のモデルの責任は実際には最初のタイプだけのように感じます。しかし、2 番目のタイプもコントローラーの責任ではありません。

OPの場合、Punchクラスでバリデーターを定義するのが最善かどうか、またはパンチのリスト全体を検証する責任を持つ新しいオブジェクトを作成するのが最善かどうかはわかりませんが、何らかの方法でオブジェクトが存在する必要がありますコレクション全体を把握しており、それが有効かどうかを判断できます。

于 2015-07-10T23:09:20.727 に答える