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. 时间表不应相互重叠

以下是我的结论:

这里有两种有效性:

  1. 单个模型的有效性(例如是否存在开始日期?)
  2. 模型集合的有效性(例如,任何一对实例是否重叠?)

我觉得只有第一种类型实际上是各个模型的责任。但第二种类型也不是控制器的责任。

在 OP 的情况下,我不确定是否最好在 Punch 类上定义一个验证器,或者创建一个负责验证整个出拳列表的新对象,但是一种或另一种方式应该有一些对象了解整个集合并可以决定它是否有效。

于 2015-07-10T23:09:20.727 回答