使用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约定是什么?
答案 0 :(得分:2)
如果您使用第二种方法,则无法获得错误。它在mysql级别而不是模型级别,因此活动记录不会告诉您用户未创建或更新的原因。
object.errors
将为空。
检查一下 http://apidock.com/rails/ActiveModel/Errors/full_messages
答案 1 :(得分:2)
有些人会争辩说你必须拥有瘦小的控制器和瘦小的模特。但是,这可以在您的应用程序中创建几个额外的类。
有时,如果记录并以逻辑方式布局,那么胖模型可以更容易阅读。我会忽略最佳实践&#39;如果它使代码更容易阅读,因为我可能并不总是唯一触及该代码的人。如果应用程序扩展到多个人将访问相同文件的点,我将考虑在那时将其提取为重构。但是,这种情况很少发生。
虽然可以对数据库设置限制,但您还希望进行客户端验证,以防止有人截断数据但没有反馈。例如,(一个非常可怕的例子),如果您要将用户的用户名限制为仅六个字符,并输入kobaltz
作为我的用户名,我会想知道为什么我的用户名/密码永远不会用作数据库将其截断为kobalt
。您还将遇到MySQL(或类似)将引发数据库级错误的问题,这些错误很难修复/排除故障。您还必须考虑是否在生产中修改数据库,如果您设置之前不存在的限制,则最终可能会损坏您的数据。
在您的模型中进行一些验证并不会使它成为一个“胖子”。在我看来模型。它使阅读更容易。如果您没有使用像RubyMine这样的IDE并且只使用编辑器,那么您就没有Jump to Definition
的奢侈品,这可以使模型的抽象更容易理解。