Validations的使用
安装gem
gem install activemodel
require 'active_model'
这样就可以使用这个gem包中内部的方法呢举个例子如下:
class User < ActiveRecord::Base
validates :username, presence: { message: "用户名不能为空" }
validates :username, uniqueness: { message: "用户名已存在" }
validates :password, presence: { message: "密码不能为空" }
validates :password, length: { minimum: 6, message: "密码长度最短为6位" }
# ...
end
.validates & .validates_*_of的使用(实际效果一样)
class User < ActiveRecord::Base
validates :username, presence: { message: "用户名不能为空" }
# same with
validates_presence_of :username, message: "用户名不能为空"
validates :username, uniqueness: { message: "用户名已存在" }
# same with
validates_uniqueness_of :username, message: "用户名已存在"
end
.validates_*_of方法
validates_acceptance_of
validates_confirmation_of
validates_format_of
validates_inclusion_of
validates_length_of
validates_numericality_of
validates_presence_of
etc.
#valid? & #errors
user = User.new(username: "hello")
user.valid? # => false
user.errors # => [password: error...]
自定义Validate使用
class User < ActiveRecord::Base
validate :should_start_with_letter
private
def should_start_with_letter
unless self.username =~ /^[a-z]/i
errors.add(:username, "should start with letter")
end
end
end
自定义Validate - ActiveModel
class EvilUserValidator < ActiveModel::Validator
def validate(record)
if record.username == "Evil"
record.errors[:base] << "This person is evil"
end
end
end
class User < ActiveRecord::Base
validates_with EvilUserValidator
end
validations触发时间
默认情况下save触发
validate用于特定的动作
class User < ActiveRecord::Base
validates_uniqueness_of :username, message: "用户名已存在", on: :create # or :update
end
跳过Validations使用
user = User.new(username: "hello")
user.save validate: false
跳过Validations的一些方法(这些方法使用的很少也要慎用)
decrement!
decrement_counter
increment!
increment_counter
toggle!
touch
update_all
update_attribute
update_column
update_columns
update_counters
具体细节请看官方API文档
http://api.rubyonrails.org/classes/ActiveModel/Validations/HelperMethods.html
rails 中的模型验证validate
最新推荐文章于 2020-08-08 08:27:35 发布