проверки для определенных действий в модели - PullRequest
3 голосов
/ 24 июня 2011

Я столкнулся с проблемой, с которой я никогда не сталкивался.Я работаю над кодом, который был написан другим программистом, и это своего рода беспорядок.

Вот проблема.У меня есть следующие проверки в моей модели:

validates_presence_of :subscription_level,
                      :message => 'please make a selection'
validates_presence_of :shipping_first_name
validates_presence_of :shipping_last_name
validates_presence_of :shipping_address
validates_presence_of :shipping_city
validates_presence_of :shipping_state
validates_presence_of :shipping_postal_code
validates_presence_of :shipping_country
validates_presence_of :billing_first_name
validates_presence_of :billing_last_name
validates_presence_of :billing_address
validates_presence_of :billing_city
validates_presence_of :billing_state
validates_presence_of :billing_postal_code
validates_presence_of :billing_country
validates_presence_of :card_number
validates_numericality_of :card_number
validates_presence_of :card_expiration_month
validates_numericality_of :card_expiration_month
validates_presence_of :card_expiration_year
validates_numericality_of :card_expiration_year
validates_presence_of :card_cvv
validates_numericality_of :card_cvv

У меня есть два действия для рассматриваемого контроллера.Один - new, а другой - redeem.Я хочу выполнить все эти проверки с помощью действия new, но хочу пропустить большинство из них для действия redeem.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что использование valid? в контроллеретакже проверяет вещи, которые не требуются для действия redeem.

Как я могу обойти это?

Ответы [ 3 ]

14 голосов
/ 24 июня 2011

Это глупо, но мне пришлось прибегнуть к использованию флага атрибута, который может включать / отключать проверки в определенных состояниях.(Моим конкретным примером была многостраничная форма, где мы в конечном итоге хотим проверить все обязательные поля для объекта, но мы можем проверить только те данные, которые были отправлены на предыдущих страницах)может выглядеть:

class Whatever < ActiveRecord::Base
  attr_accessor :enable_strict_validation

  validates_presence_of :name # this always happens
  validates_uniqueness_of :name, :if => :enable_strict_validation
end

Затем в другом месте (например, ваш контроллер), вы можете сделать:

@whatever = Whatever.new(...)
@whatever.save  # <= will only run the first validation

@whatever.enable_strict_validation = true
@whatever.save  # <= will run both validations
4 голосов
/ 24 июня 2011

Проверки не обрабатываются контроллером и, как таковые, не зависят от действий.

Однако проверки могут быть ограничены в зависимости от типа обновления, вносимого в модель.Обновить, создать или сохранить.

Будет ли для вас возможным ограничить проверки только новыми записями?

validates_numericality_of :card_cvv, :on => :create

Если нет, вы можете написать собственные средства проверкидля обработки возврата true в указанных вами условиях (таких как действие контроллера), но, опять же, это не «Rails Way».

Простейшим примером будет использование validate метода

validate do
  return true if my_action_is_redeem

  self.card_cvv =~ /^\d*$/
end

Для получения дополнительной информации о проверках см. документы

1 голос
/ 04 апреля 2013

вы можете ограничить валидацию при создании (новом) или при обновлении (операция восстановления - это обновление?).

Ваша проверка может быть такой:

validates_presence_of :attribute1, :on => :update #so, only on redem method is validated)

Вы можете выбрать, когда проверять, по этим событиям:: создать,: обновить,: сохранить (как создать, так и обновить)

Подробнее о: http://guides.rubyonrails.org/active_record_validations_callbacks.html#on

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