У меня есть ассоциации адресов и телефонов с моделью пользователя, что означает, что у пользователя может быть несколько адресов и несколько телефонов.
Мне нужно сохранить 1 адрес и 1 телефон во время регистрации, где я использую devise_token_auth gem.
user.rb
has_many :addresses, dependent: :destroy
has_many :phones, dependent: :destroy
accepts_nested_attributes_for :addresses
accepts_nested_attributes_for :phones
application_controller.rb
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up,
keys: [
:email,
:name,
addresses_attributes: %i[street_1 street_2 city state country zip label default],
phones_attributes: %i[label dial default]
]
)
end
Проблема
Если я отправляю атрибуты адреса и телефона пустыми / недействительными, я получаю сообщение об ошибке JSON следующего содержания:
{
"status": "error",
"data": {
...
},
"errors": {
"addresses.label": [
"can't be blank"
],
"addresses.street_1": [
"can't be blank"
],
"addresses.city": [
"can't be blank"
],
"phones.dial": [
"Not a valid 10-digit telephone number"
],
"full_messages": [
"Addresses label can't be blank",
"Addresses street 1 can't be blank",
"Addresses city can't be blank",
"Phones dial Not a valid 10-digit telephone number",
]
}
}
После статьи Ошибки можно индексировать с вложенными атрибутами в Rails 5 с использованием index_errors: true
, я получаю сообщение об ошибке JSON как:
{
"status": "error",
"data": {
...
},
"errors": {
"addresses[0].label": [
"can't be blank"
],
"addresses[0].street_1": [
"can't be blank"
],
"addresses[0].city": [
"can't be blank"
],
"phones[0].dial": [
"Not a valid 10-digit telephone number"
],
"full_messages": [
"Addresses[0] label can't be blank",
"Addresses[0] street 1 can't be blank",
"Addresses[0] city can't be blank",
"Phones[0] dial Not a valid 10-digit telephone number",
]
}
}
Что мне действительно нужно, так это что-то вроде следующего, которое я могу легко пройти на любом языке :
errors: {
addresses: {
label: ["can't be blank"],
street_1: ["can't be blank"],
...
},
phones: {
dial: ["Not a valid 10-digit telephone number"]
}
}