Итак, у меня есть пользователь, у которого много адресов.
У пользователя есть accepts_nested_attributes_for :addresses, allow_destroy: true
Теперь у меня есть форма редактирования. У меня есть API, который может отправлять адреса, и они могут быть недействительными (т.е. отсутствует адресная строка 1). Когда пользователь попадает в эту форму, он должен отредактировать адрес и отправить его. Однако, если они ничего не изменят в форме, она будет отправлена нормально, не выполнив проверки для вложенных атрибутов адресов.
Я полагаю, что происходит, проверки не выполняются по адресам, потому что не было никаких изменений в адресных атрибутах, даже если они возвращаются в параметрах. Я смог сделать следующее, чтобы убедиться, что только при неправильном адресе проверки будут выполняться на них.
user = User.find(1)
# The values I'm assigning here are the exact same attributes saved to the database, address_line_1 is missing here and in the database but there is a validation in the address model for it
user.assign_attributes(addresses_attributes: { "0" => { id: 5, address_line_1: "", state: "CA", zip: "90123", address_type: "work" } })
user.valid? # true
user.assign_attributes(addresses_attributes: { "0" => { id: 5, address_line_1: "Dogs", state: "", zip: "90123", address_type: "work" } })
user.valid? # false (in this case the state validation fails but it goes to show that validations are only run when the address is dirty)
Мне кажется, что это ожидаемое поведение, но я не смог найти никакой документации на этом. Может кто-нибудь направить меня к документации по этому поведению? Или объясни мне это.
После еще нескольких копаний, я думаю, я нашел здесь то, что искал: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/autosave_association.rb#L293