【问题标题】:What is the Rails Convention for validating field length?验证字段长度的 Rails 约定是什么?
【发布时间】:2015-04-06 15:09:10
【问题描述】:

使用 ActiveRecord 模型,我知道您可以像这样验证输入字段的长度

class User
  validates :user_name, length: { maximum: 20 }
end

但是,Rails 中的一种设计模式推荐使用瘦模型。如果你有大量的验证,上面的代码可能看起来很吓人。我读到还有另一种方法可以做到这一点。

您可以简单地使用ActiveRecord::Schema 来完成相同的任务。

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :user_name, limit: 20
    end
  end
end

这完成了完全相同的事情,只是您甚至不需要 Users 模型中的第二行。

关于这方面的标准 Rails 约定是什么?

【问题讨论】:

  • 如果你想控制验证做validates :user_name, length: { maximum: 20 },如果你让你的数据库控制你将输入100个字符并且你的数据库将截断它,而不是报告字符串超过20的错误字符。
  • 有些人会争辩说你必须有瘦控制器和瘦模型。但是,这可以在您的应用程序中创建几个额外的类。有时,如果有文档并按逻辑布局,那么胖模型会更容易阅读。如果它使代码更易于阅读,我将忽略“最佳实践”,因为我可能并不总是唯一接触该代码的人。如果应用程序扩展到多个人将访问相同文件的程度,我将考虑在那时将其提取为重构。然而,这种情况很少发生。

标签: ruby-on-rails validation activerecord model convention


【解决方案1】:

有些人会争辩说,您必须拥有纤细的控制器和纤细的模型。但是,这可以在您的应用程序中创建几个额外的类。

有时,如果有文档并按逻辑布局,那么胖模型会更容易阅读。如果它使代码更易于阅读,我将忽略“最佳实践”,因为我可能并不总是唯一接触该代码的人。如果应用程序扩展到多个人将访问相同文件的程度,我将考虑在那时将其提取为重构。然而,这种情况很少发生。

虽然最好对数据库设置限制,但您还希望进行客户端验证,以防止有人在没有反馈的情况下截断数据。例如,(一个非常可怕的例子),如果你将用户的用户名限制为只有六个字符,并且我输入 kobaltz 作为我的用户名,我会想知道为什么我的用户名/密码永远无法工作,因为数据库截断了它到kobalt。您还将遇到 MySQL(或类似的)会抛出数据库级错误的问题,这对修复/故障排除很烦人。您还必须考虑是否在生产中修改数据库,如果您设置了以前不存在的限制,您最终可能会损坏您的数据。

在我看来,在您的模型中进行一些验证并不会使其成为“胖”模型。它使阅读更容易。如果您没有使用 RubyMine 之类的 IDE 并且仅使用编辑器,那么您就没有 Jump to Definition 的奢侈,它可以使您的模型的抽象更易于遵循。

【讨论】:

    【解决方案2】:

    如果您使用第二种方法,您将无法得到错误。它在 mysql 级别而不是在模型级别,因此活动记录不会告诉您未创建或更新用户的原因。

    object.errors
    

    将为空。

    检查这个 http://apidock.com/rails/ActiveModel/Errors/full_messages

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-28
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      相关资源
      最近更新 更多