如何将验证与模型分开

Adr*_*n M 5 ruby ruby-on-rails

我有一些非常大的模型,我必须迁移到最新版本的Rails.这些模型有很多验证(User有50次验证).

是否可以将所有这些验证移到另一个文件中?说app/models/validations/user_validations.rb.如果有人可以提供一个例子,拜托?

A F*_*kly 8

你可以使用这个问题:

# app/models/validations/user_validations.rb

require 'active_support/concern'

module UserValidations
  extend ActiveSupport::Concern
  included do
    validates :password, presence: true
  end
end

# app/models/user.rb
class User
  include UserValidations
end
Run Code Online (Sandbox Code Playgroud)

根据您的自动加载路径配置,您可能需要/想要命名您的问题:

# app/models/validations/user.rb

require 'active_support/concern'

module Validations
  module User
  ...


# app/models/user.rb

class User
  include Validations::User
Run Code Online (Sandbox Code Playgroud)

从样式的角度来看,您可能想要考虑为什么要进行这么多验证.将它们分组到模块中会使模型文件变细,但实际上该类仍然带有所有代码.你有效地解决了地毯下的问题.

您是否使用了许多具有不同验证要求的不同表单?如果是这样,您可以使用表单对象(包括ActiveModel功能)来封装每个表单所需的验证和处理,从而消除模型的压力.

你的模型有多少疯狂的领域?也许你的用户对象需要由较小的对象组成,如个人资料,地址,头像等.

当然,这超出了版本迁移的范围!

如果你不能或不想使用ActiveRecord关注点(它有一些你可能不想随身携带的依赖管理代码),你可以使用优秀的微型插件'augmentations'或派生的gem:

https://github.com/chemica/augmentations-gem

这使用了非常相似的语法和更少的代码.它也没有使用术语"关注点",这可能意味着不同语言/框架的OO术语中的其他内容.

  • 它们很方便,但有助于将其视为潜在形成新阶级的垫脚石,而不是将其作为目的本身.它们也可用于在模型之间共享行为,同样需要注意. (2认同)