Настроен ha sh для ошибок вложенных атрибутов в рельсах - PullRequest
2 голосов
/ 16 июня 2020

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

Мне нужно сохранить 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"]
   }
}
...