我正在开发一个处理员工时间卡的应用程序,我正在尝试创建一个表单,允许员工在给定的时间段内编辑所有的拳。我使用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]
,但这似乎违反了“胖模型,瘦模控制器”的惯例。
我有什么方法可以吃蛋糕并吃它吗?任何建议都会非常感激。
答案 0 :(得分:0)
我正在努力解决类似的问题:
以下是我的结论:
这里有两种有效性:
我觉得只有第一种类型实际上是个别模特的责任。但第二种类型也不是控制器的责任。
在OP的情况下,我不确定是否最好在Punch类上定义验证器,或者创建一个负责验证整个打孔列表的新对象,但是应该有这样或那样的方式。一些了解整个集合的对象,可以决定它是否有效。