Rails 3: отображение ошибок валидации для формы (без сохранения модели ActiveRecord) - PullRequest
5 голосов
/ 02 мая 2011

Извинения, если это действительно распространенный и / или нелепый вопрос;Клянусь, я перечитывал документацию несколько раз, и все кажется настолько сосредоточенным на ActiveRecord, что они пошли по пути форм, которые делают что-то иное, чем создание или редактирование данных модели.

Взять, к примеру,Форма с входами для управления извлечением и отображением некоторой статистики.Что предоставляет мне rails для проверки ввода этой формы пользователем, который не будет вызывать save ни для каких записей?Такие вещи, как:

  • :email должен быть адресом электронной почты
  • :num_products должен быть положительным целым числом
  • :gender должен быть одним из "M""или" F "
  • :temperature должно быть в диапазоне от -10 до 120

и т. д. (и т. п., что входит в стандартную комплектацию большинства веб-платформ) ...

Есть ли что-то в Rails для меня, чтобы выполнить эту произвольную проверку и какой-нибудь помощник вида для отображения списка ошибок, или все это связано с ActiveRecord?

Извинения, если я упустил это из виду в документации, но это и это на самом деле не покрывает это, по крайней мере, насколько могут утомленные глаза.

царапает голову

Благодаря ответу Роба, вот что я придумала.Я создал служебный класс (метко названный Validator), который просто встроен в мои контроллеры для всего, что ему нужно.

module MyApp

    class Validator
        include ActiveModel::Validations
        include ActiveModel::Conversion
        extend  ActiveModel::Naming

        def initialize(attributes = {})
            super
            attributes.each { |n, v| send("#{n}=", v) if respond_to?("#{n}=") }
        end
    end

end

Теперь в контроллере, например, просто определите небольшой встроенный класс:

class LoginController < ApplicationController
    class AuthenticationValidator < MyApp::Validator
        attr_accessor :email
        attr_accessor :password
        validates_presence_of :email, :message => "E-mail is a required field"
        validates_presence_of :password, :message => "Password cannot be blank"
    end

    def authenticate
        if request.post?
            @validator = AuthenticationValidator.new(params)
            if @validator.valid?
                # Do something meaningful
            end
        end
    end

Немного не нужно вставлять каждый отдельный набор правил валидации в свои .rb, когда логика более ориентирована на контроллер IMHO.Вероятно, есть более краткий способ написать это, но я довольно новичок в Ruby и Rails.

Ответы [ 2 ]

6 голосов
/ 02 мая 2011

Да, это можно сделать довольно легко.

Вы можете использовать проверки API для него.

В качестве примера приведем модель обратной связи, которую я использую для приложения, в котором не используется ActiveRecord.

class ContactUs
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :name, :email, :subject, :message
  validates_presence_of :name, :email, :message, :subject
  validates_format_of :email, :with => /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\z/
  def initialize(attributes=nil)
    attributes.each do |name, value|
      send("#{name}=", value)
    end unless attributes.nil?
  end

  def persisted?
    false
  end
end
0 голосов
/ 02 мая 2011

В модели существует допустимый метод, который запускает проверку.

поэтому вместо model.save попробуйте model.valid?

...