Контекст проверки Rails - PullRequest
5 голосов
/ 17 мая 2011

Мне нужна помощь с моей моделью ActiveRecord. У меня есть контекстные проверки (неправильно) с использованием встроенных параметров контекста для проверок:

validates :foo, :on => :bar, :presence => true

model = Model.new
model.foo = nil
model.valid? # => true
model.save # works as expected

model.valid?(:bar) # => false
model.save(:context => :bar) # fails and returns false

Но использование моей модели в accepts_nested_attributes_for :model и вызов parent.save не удается (проверка вызывается и возвращает false), какие-либо предложения или решения?


Все еще нет ответа? Чтобы объяснить больше о моей проблеме: у меня есть модель с именем Form, которая имеет много Field с. Пользователи должны видеть ошибки проверки при отправке, но форма должна быть сохранена в любом случае (с ошибками и без них). Существуют различные типы Field s, каждый из которых имеет глобальные проверки (для обеспечения согласованности базы данных) и свои собственные определенные пользователем проверки (для проверки введенных пользователем данных). Так что мои Field выглядят так:

 # Global validations, to ensure database consistency
 # If this validations fail, the record should not be saved!
 validates_associated :form, :on => :global
 ...

 # Specific user-defined validations
 # If this validations fail, the record should be saved but marked as invalid. (Which is done by a before_save filter btw.)
 def validate
   validations.each do |validation| # Array of `ActiveModel::Validations`, defined by the user and stored in a hash in the database
     validation.new(:on => :specific).validate(self)
   end
 end

В моем контроллере:

 # def create
 # ...
 form.attributes = params[:form]
 form.save!(:global)
 form.save(:specific)

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

Ответы [ 3 ]

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

Попробуйте условные проверки

class Customer 
  attr_accessor :managing 

  validates_presence_of :first_name
  validates_presence_of :last_name 

  with_options :unless => :managing do |o|
    o.validates_inclusion_of :city, :in=> ["San Diego","Rochester"]
    o.validates_length_of :biography, :minimum => 100 
  end
end

@customer.managing = true
@customer.attributes = params[:customer]
@customer.save
5 голосов
/ 05 мая 2014

«Возможность задавать несколько контекстов при определении валидации» была введена в Rails 4.1 - проверка метод проверки,: в описании опций

0 голосов
/ 17 мая 2011

Изменить has_nested_attributes_for :model на accepts_nested_attributes_for :models.

Надеюсь, это поможет.

Удачи.

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