【问题标题】:Rails 2.3.4 Persisting Model on Validation FailureRails 2.3.4 验证失败的持久模型
【发布时间】:2013-12-31 22:06:16
【问题描述】:

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

为了便于讨论,我们称之为“汽车”模型。

car.save

被调用验证器触发并在模型中设置错误字段列表。

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

他们使用的验证模式很棒,但是当验证失败时我如何获得一个挂钩,以便我可以从模型中删除虚假条目?

我可以看到手动迭代错误列表并编写一个大案例语句,但这似乎是一个 hack。

【问题讨论】:

    标签: ruby-on-rails validation rails-activerecord ruby-on-rails-2


    【解决方案1】:

    在您的控制器中,如果验证失败,则从您的 create 操作中呈现 new 操作,并使用从用户输入填充的实例变量 @car(即 params 哈希)。然后,在您的视图中,添加一个逻辑检查(form 周围的 if 块或助手上的三元组,您可以选择)自动将表单字段的值设置为传递给 @car 的 params 值如果汽车存在。这样,表格在第一次访问时将是空白的,理论上只有在出现错误的情况下才会重新呈现。在任何情况下,除非设置了@car,否则它们不会被填充。

    【讨论】:

    • 我认为您误解了这个问题。我所追求的是一种从模型中删除无效字段的方法。
    • 我已经有了在失败时重新填充表单的工作逻辑,但将坏数据放回那里看起来很糟糕。
    【解决方案2】:

    编辑: 不要这样做(参见 cmets),但如果你必须这样做,方法如下:

    我最终使用了一个电话

    @car.invalid? 
    

    在循环内部删除无效条目:

      params[:car].each do | key, array|
          if @car.errors.invalid?(key)
            @car[key.to_sym] = ''
          end
      end
      render :action=> 'new'
    

    请注意此处使用渲染与重定向。通过重定向从 Rails 模型验证中获取错误消息似乎很棘手,请参阅: Rails validation over redirect

    我仍然觉得应该有一个辅助方法或更好的方法。

    【讨论】:

    • 很难从您的匿名模型名称中得出结论,但大多数情况下,如果您将数据留在字段中,用户体验可能会更好。以汽车为例,如果将型号年份错误键入为“212”而不是“2012”显示错误消息“您必须输入大于 1950 的年份”和空白年份,我会觉得很烦人 - 据我记得在点击“保存”之前,我确实输入了一个有效的。
    • @MattJones 我同意你的看法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    相关资源
    最近更新 更多