Ruby on rails Rails 2.3.4验证失败时的持久化模型

Ruby on rails Rails 2.3.4验证失败时的持久化模型,ruby-on-rails,validation,rails-activerecord,ruby-on-rails-2,Ruby On Rails,Validation,Rails Activerecord,Ruby On Rails 2,我有一个标准的html表单帖子,正在服务器端使用rails模型进行持久化和验证 为了便于讨论,我们将其称为汽车模型 什么时候 被调用时,验证程序将激发并在模型中设置错误字段列表 我如何才能最好地取回已删除验证失败的字段的对象,即不必删除用户正确输入的表单上的字段 他们使用的验证模式非常好,但是当验证失败时,如何获得一个钩子,以便从模型中删除虚假条目 我可以看到手动迭代错误列表并编写一个大型case语句,但这看起来像是一个黑客行为 在控制器中,如果验证失败,则通过创建操作呈现新操作,实例变量@ca

我有一个标准的html表单帖子,正在服务器端使用rails模型进行持久化和验证

为了便于讨论,我们将其称为汽车模型

什么时候

被调用时,验证程序将激发并在模型中设置错误字段列表

我如何才能最好地取回已删除验证失败的字段的对象,即不必删除用户正确输入的表单上的字段

他们使用的验证模式非常好,但是当验证失败时,如何获得一个钩子,以便从模型中删除虚假条目


我可以看到手动迭代错误列表并编写一个大型case语句,但这看起来像是一个黑客行为

在控制器中,如果验证失败,则通过创建操作呈现新操作,实例变量@car由用户输入填充,即params散列。然后,在您的视图中,在表单周围添加一个if块或在helpers上添加一个三元逻辑检查,您的选择会自动将表单字段的值设置为传入@car(如果car存在)的参数值。这样,表单在第一次访问时将是空白的,理论上只有在出现错误的情况下重新渲染时才会填充。在任何情况下,除非设置了@car,否则不会填充它们

编辑: 不要这样做,请参阅注释,但如果必须这样做,请参见以下方法:

最后我打了个电话给他

@car.invalid? 
在循环内部删除无效项:

  params[:car].each do | key, array|
      if @car.errors.invalid?(key)
        @car[key.to_sym] = ''
      end
  end
  render :action=> 'new'
请注意此处渲染与重定向的用法。从rails模型验证跨重定向持久化错误消息似乎很棘手,请参阅:


我仍然觉得应该有一个辅助方法来解决这个问题,或者有一个更好的方法。

我想你误解了这个问题。我所追求的是一种从模型中删除无效字段的方法。我已经具备了在失败时重新填充表单的工作逻辑,但将坏数据放回表单中看起来很糟糕。很难从匿名模型名称中得出结论,但大多数时候,如果将数据保留在字段中,UX可以说更好。以汽车为例,如果将2012车型年改为212车型年时出现错误信息,说明您必须输入大于1950的年份和空白年份,我会觉得很烦人。据我记忆,在点击“保存”之前,我输入了一个有效的年份。@MattJones我同意您的看法。
  params[:car].each do | key, array|
      if @car.errors.invalid?(key)
        @car[key.to_sym] = ''
      end
  end
  render :action=> 'new'