验证字段长度的 Rails 约定是什么?

What is the Rails Convention for validating field length?

使用 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 约定是什么?

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

object.errors

将为空。

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

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

有时,如果记录和布局合理,拥有一个胖模型会更容易阅读。如果 'best practices' 使代码更易于阅读,我将忽略它,因为我可能并不总是唯一接触该代码的人。如果应用程序扩展到多个人将访问相同文件的程度,我会考虑在那个时候提取它作为重构。然而,这种情况很少见。

虽然对您的数据库设置限制是件好事,但您也希望进行客户端验证,以防止有人在没有反馈的情况下对他们的数据进行处理运行。例如,(一个非常糟糕的例子),如果你将一个用户的用户名限制为只有六个字符,而我输入 kobaltz 作为我的用户名,我会想知道为什么我的 username/password 从来没有像数据库 t运行 将其分类为 kobalt。您还将 运行 遇到 MySQL(或类似的)会引发数据库级错误的问题,这对 fix/troubleshoot 来说很烦人。您还必须考虑是否在生产中修改数据库,如果您在以前不存在的地方设置限制,您最终可能会破坏您的数据。

在我看来,在您的模型中进行一些验证并不能使它成为 'fat' 模型。它使它更容易阅读。如果您不使用像 RubyMine 这样的 IDE 并且只使用编辑器,那么您就没有 Jump to Definition 的奢侈,它可以使您的模型的抽象更容易理解。