我正在开发一个处理员工考勤卡的应用程序,并且我正在尝试创建一个表单,允许员工在给定的时间段内编辑他们所有的打卡。我使用这个 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]
发送到控制器中的更新方法,但这似乎与“胖模型,瘦控制器”的约定背道而驰。
有什么办法可以让我的蛋糕也吃吗?任何建议将不胜感激。