Rails:无需模型即可验证输入

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.

  • 正如我在问题中所说的,没有模型,有没有办法做到这一点?并非所有通过表单发送的数据都旨在成为模型。 (2认同)

Jak*_*b S 5

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)