Enr*_*ent 2 ruby validation ruby-on-rails
假设我有一个带有值的输入字段,我想验证它(在服务器端)以确保,例如,该字段至少有5个字符.
问题是我不想在数据库中保存或构建模型.我只想检查值是否有效.
在使用Laravel的PHP中,验证非常简单:
$validator = Validator::make($data, [
'email' => ['required', 'email'],
'message' => ['required']]);
if ($validator->fails()) { // Handle it... }
Run Code Online (Sandbox Code Playgroud)
Rails中有类似的东西,不需要ActiveRecord或ActiveModel吗?并非每个表单发送的数据都可以作为模型使用.
Dou*_*gui 11
您可以像这样使用ActiveModel :: Validations
class MyClass
include ActiveModel::Validations
validates :email, presence: true
validates :message, presence: true
end
Run Code Online (Sandbox Code Playgroud)
它将作为一个正常的模型,你将能够做到my_object.valid?和my_object.errors.
Rails 验证存在于ActiveModel这样做似乎不会产生ActiveModel适得其反的效果。现在,如果你能稍微放松一下这个要求,那绝对是可能的。
我读到你所要求的,以及我读到的 PHP 代码所做的,是一个可以动态配置的验证器对象。
例如,我们可以动态构建一个验证器类并使用该类的实例来运行我们的验证。我选择了一种与 PHP 类似的 API:
class DataValidator
def self.make(data, validations)
Class.new do
include ActiveModel::Validations
attr_reader(*validations.keys)
validations.each do |attribute, attribute_validations|
validates attribute, attribute_validations
end
def self.model_name
ActiveModel::Name.new(self, nil, "DataValidator::Validator")
end
def initialize(data)
data.each do |key, value|
self.instance_variable_set("@#{key.to_sym}", value)
end
end
end.new(data)
end
end
Run Code Online (Sandbox Code Playgroud)
现在,我们可以使用DataValidator.make我们需要的特定验证来构建类的实例。例如在控制器中:
validator = DataValidator.make(
params,
{
:email => {:presence => true},
:name => {:presence => true}
}
)
if validator.valid?
# Success
else
# Error
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4856 次 |
| 最近记录: |