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

时间:2015-04-06 15:09:11

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

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

2 个答案:

答案 0 :(得分:2)

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

object.errors

将为空。

检查一下 http://apidock.com/rails/ActiveModel/Errors/full_messages

答案 1 :(得分:2)

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

有时,如果记录并以逻辑方式布局,那么胖模型可以更容易阅读。我会忽略最佳实践&#39;如果它使代码更容易阅读,因为我可能并不总是唯一触及该代码的人。如果应用程序扩展到多个人将访问相同文件的点,我将考虑在那时将其提取为重构。但是,这种情况很少发生。

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

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