2014-02-09 2 views
1

У меня есть эта простая настройка: учетная запись #has_one Владелец класса Person.Rails вложенная форма, игнорирующая условия проверки

Теперь форма для создания и обновления учетной записи использует вложенную форму для атрибутов человека - например, имя, адрес электронной почты и пароль.

Есть валидация этих атрибутов - пароль требует подтверждения электронной почты не может быть пустым и т.д.

Но некоторые валидация есть условия использования :if.

Например, я только требует наличия пароля, если атрибут password_digest является пустым, так:

validates_presence_of :password, :if => :requires_password? 

def requires_password? 
    password_digest.blank? 
end 

Дело в том: это обходя состояние, как игнорирование его полностью, НО только при использовании вложенной формы, указанной выше.

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

Что происходит?

Я использую Rails 4.1.0.beta1.

Обновление. Просто узнал, что это не связано с проверками, но с тем, что это происходит только в #update. При рендеринге вложенной формы она пытается создать новую, а не обновлять существующую.

ответ

0

Это поведение по умолчанию has_one в ActiveRecord. Вы должны добавить атрибут и значение validate: true для has_one отношений

class Account < ActiveRecord::Base 

    has_one :owner, class_name: 'Person', validate: true, unless: :password_digest? 
end 

взглянуть на http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one.

+0

Я думаю, что есть недоразумение. Проверка делает WORK, проблема в том, что условие (': if') игнорируется. Вы предполагаете, что 'validate: true' исправит это? Другое дело, класс, который использует 'has_one', является Лицом, но форма другая, это для учетной записи с человеком, вложенным в нее.Другими словами, вложенная форма предназначена для отношения 'own_to'. –

0

Обнаружена проблема. Из API Rails:

: update_only

Для ассоциации один-к-одному, эта опция позволяет указать, как вложенные атрибуты, которые будут использоваться, когда связанная запись уже существует. В общем случае существующая запись может либо обновляться с новым набором значений атрибутов, либо заменяться полностью новой записью, содержащей эти значения. По умолчанию параметр: update_only является ложным, а вложенные атрибуты используются для обновления существующей записи только в том случае, если они включают значение идентификатора записи: id. В противном случае новая запись будет создана и использована для замены существующей. Однако, если параметр: update_only равен true, вложенные атрибуты используются для обновления атрибутов записи всегда, независимо от того, присутствует ли: id. Опция игнорируется для ассоциаций коллекции.

Всё.

Смежные вопросы