ruby-on-rails Rails 3 -相互验证模型的多个示例

nkhmeac6  于 2022-12-30  发布在  Ruby
关注(0)|答案(1)|浏览(164)

我正在开发一个处理员工考勤卡的应用程序,我正在尝试创建一个表单,允许员工编辑他们在给定时间段内的所有打卡记录。我使用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

但问题是,我需要能够验证用户没有以没有意义的方式编辑他们的打卡(例如,将他们的上班打卡更改为晚于下班打卡,反之亦然)。
我尝试过通过自定义模型验证来实现这一点,但是通过验证的各个模型并不知道正在更新的其他值,因此批处理中的第一步是将其新值与其他值更新前的值进行比较。
我能想到的唯一其他方法是循环通过发送到控制器中的update方法的params[:punches],但这似乎与“胖模型,瘦控制器”的惯例背道而驰。
有什么方法可以让我既能吃蛋糕又能吃蛋糕吗?有什么建议将不胜感激。

cbjzeqam

cbjzeqam1#

我也在纠结一个类似的问题:
1.计划具有开始日期和结束日期
1.日程安排不应相互重叠
我的结论是:
这里有两种有效性:
1.单个模型的有效性(例如,是否存在开始日期?)
1.模型集合的有效性(例如,是否有任何示例对重叠?)
我觉得其实只有第一种是模特个人的责任,但是第二种也不是总监的责任。
在OP的情况下,我不确定是在Punch类上定义一个验证器,还是创建一个负责验证整个punch列表的新对象,但无论如何,应该有某个对象知道整个集合,并可以决定它是否有效。

相关问题