Rails 3 - 相互验证模型的多个实例

时间:2012-05-15 16:04:58

标签: ruby-on-rails forms validation architecture refactoring

我正在开发一个处理员工时间卡的应用程序,我正在尝试创建一个表单,允许员工在给定的时间段内编辑所有的拳。我使用this 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],但这似乎违反了“胖模型,瘦模控制器”的惯例。

我有什么方法可以吃蛋糕并吃它吗?任何建议都会非常感激。

1 个答案:

答案 0 :(得分:0)

我正在努力解决类似的问题:

  1. 时间表有开始和结束日期
  2. 时间表不应相互重叠
  3. 以下是我的结论:

    这里有两种有效性:

    1. 各个模型的有效性(例如,开始日期是否存在?)
    2. 模型集合的有效性(例如,任何实例对是否重叠?)
    3. 我觉得只有第一种类型实际上是个别模特的责任。但第二种类型也不是控制器的责任。

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