Валидация в Rails без модели - PullRequest
7 голосов
/ 25 августа 2010

У меня есть форма, которая позволяет пользователю отправлять сообщение на электронную почту, и я хочу добавить к ней подтверждение. У меня нет модели для этого, только контроллер. Как мне это сделать в Rails?

Я собирался выполнить проверку в контроллере и отобразить ошибки пользователю с помощью объекта flash . Есть ли лучший способ сделать это?

Ответы [ 2 ]

6 голосов
/ 25 августа 2010

Лучший подход - заключить псевдомодель в класс и добавить туда проверки. Путь Rails гласит, что вы не должны помещать поведение модели в контроллеры, единственными валидациями должны быть те, которые соответствуют самому запросу (аутентификация, авторизация и т. Д.)

В Rails 2.3+ вы можете включить ActiveRecord::Validations, с небольшим недостатком, который вы должны определить, какие методы ожидает слой ActiveRecord. См. этот пост для более глубокого объяснения. Код ниже адаптирован из этого поста:

require 'active_record/validations'

class Email

  attr_accessor :name, :email
  attr_accessor :errors

  def initialize(*args)
    # Create an Errors object, which is required by validations and to use some view methods.
    @errors = ActiveRecord::Errors.new(self)
  end

  # Required method stubs
  def save
  end

  def save!
  end

  def new_record?
    false
  end

  def update_attribute
  end

  # Mix in that validation goodness!
  include ActiveRecord::Validations

  # Validations! =)
  validates_presence_of :name
  validates_format_of :email, :with => SOME_EMAIL_REGEXP
end

В Rails3 в вашем распоряжении эти сексуальные проверки :)

2 голосов
/ 14 января 2015

Для Rails 3+ вы должны использовать ActiveModel::Validations, чтобы добавить валидации в стиле Rails к обычному объекту Ruby.

С Документы :

Активные проверки модели

Предоставляет полную структуру проверки для ваших объектов.

Минимальная реализация может быть:

class Person
  include ActiveModel::Validations

  attr_accessor :first_name, :last_name

  validates_each :first_name, :last_name do |record, attr, value|
    record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z
  end
end

Который предоставляет вам полный стандартный стек проверки, который вы знать из Active Record:

person = Person.new
person.valid?                   # => true
person.invalid?                 # => false

person.first_name = 'zoolander'
person.valid?                   # => false
person.invalid?                 # => true
person.errors.messages          # => {first_name:["starts with z."]}

Обратите внимание, что ActiveModel::Validations автоматически добавляет метод ошибок к вашим экземплярам, ​​инициализированным с новым ActiveModel::Errors объектом, поэтому вам не нужно делать это вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...