Ruby on rails Rails:验证输入而不需要模型
假设我有一个带有值的输入字段,我想验证它(在服务器端),以确保该字段至少有5个字符 问题是,我不想将其保存在数据库中,也不想构建模型。我只想检查值是否有效 在使用Laravel的PHP中,验证非常简单:Ruby on rails Rails:验证输入而不需要模型,ruby-on-rails,ruby,validation,Ruby On Rails,Ruby,Validation,假设我有一个带有值的输入字段,我想验证它(在服务器端),以确保该字段至少有5个字符 问题是,我不想将其保存在数据库中,也不想构建模型。我只想检查值是否有效 在使用Laravel的PHP中,验证非常简单: $validator = Validator::make($data, [ 'email' => ['required', 'email'], 'message' => ['required']]); if ($validator->fails()) { //
$validator = Validator::make($data, [
'email' => ['required', 'email'],
'message' => ['required']]);
if ($validator->fails()) { // Handle it... }
Rails中是否有类似的东西,而不需要ActiveRecord或ActiveModel?并不是从表单发送的所有数据都可以作为模型使用。您可以像这样使用ActiveModel::Validation
class MyClass
include ActiveModel::Validations
validates :email, presence: true
validates :message, presence: true
end
它将充当一个普通的模型,您将能够执行
my\u对象。有效?
和my\u对象。错误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
使用DataValidator.make
我们现在可以使用我们需要的特定验证构建类的实例。例如,在控制器中:
validator = DataValidator.make(
params,
{
:email => {:presence => true},
:name => {:presence => true}
}
)
if validator.valid?
# Success
else
# Error
end
正如我在问题中所说的,有没有一种方法可以在没有模型的情况下实现呢?并非通过表单发送的所有数据集都是模型。这不是模型,这是类。这是ruby的方式。如果你有复杂的事情要做,你会在课堂上做。Ruby是一种真正面向对象的语言。因此没有任何方法或验证助手以简单直接的方式进行验证?我看到的唯一其他方法是手动进行验证,但我不认为有理由不使用类。这可能取决于应用程序的性质。无论如何,我想知道它是否可行。为什么不在表单中使用javascript验证并使用表单对象呢。如有必要,它将帮助您在其他地方重用表单及其逻辑。客户端验证可由用户操作,不可靠关于您添加的链接,它要求您发布的信息可以定义为资源(基本上与定义模型相同)。我正在寻找没有那么多模糊的验证。简单直接,就像PHP示例中一样。好的一点,我只是想问,我基本上在哪里添加这个类?在控制器或模型下添加此选项更好吗?我想这是一个偏好问题。它不是控制器,所以那可能不是正确的地方。它也不是真正的业务对象,因此app/models
可能不是最好的地方lib
是一个现有的替代方案,或者您可以创建app/validators
或类似的东西。@JakobS-感谢您的回答+酷的元编程。使用Class.new do…..end.new()
的意义是什么?那是在做什么,你为什么要这样做?无法通过简单地匹配Class.new do…end
并将所有内容直接粘贴到DataValidator
类中来查看上述代码正在执行的所有操作?因此Class.new{}
返回一个新类,随后的.new(data)
返回该类的实例,这意味着DataValidator.make
返回一个实例,您可以在上调用valid?
。您不能将块的内容复制/粘贴到一个新类中,因为内容依赖于两个参数,尽管我希望被证明是错误的:)这是一种动态的、更复杂的硬编码方式,实际上与原始PHP代码相同;即构建一个验证器对象。