Ruby on rails Rails:验证输入而不需要模型

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()) { //

假设我有一个带有值的输入字段,我想验证它(在服务器端),以确保该字段至少有5个字符

问题是,我不想将其保存在数据库中,也不想构建模型。我只想检查值是否有效

在使用Laravel的PHP中,验证非常简单:

$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代码相同;即构建一个验证器对象。