Когда проверки Rails запускаются для вложенных атрибутов - PullRequest
0 голосов
/ 07 января 2020

Итак, у меня есть пользователь, у которого много адресов.

У пользователя есть 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

...