Rails не помечает вложенные атрибуты как недопустимые при неудачной проверке.
Например: у меня две модели; User
и UserProfile
.
User содержит email
и password
UserProfile содержит username
, first_name
, last_name
, et c
User
проверяет наличие email
и уникальность UserProfile
проверяет наличие username
и соответствие регулярному выражению
В форме регистрации User
принимает вложенные атрибуты для UserProfile.username
.
Если вы оставите все поля пустыми и нажмете «Отправить», все ошибки проверки будут отображаться правильно. Однако только поля, которые напрямую связаны с User
, имеют класс .is-invalid
, а поле username
- нет.
Как получить вложенные поля формы для добавления класса .is-invalid
в неудачные проверки? Это что-то, что мне нужно сделать где-то вручную?
User
модель:
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable,
:confirmable, :lockable, stretches: 13
# -- Relationships --------------------------------------------------------
has_one :user_profile, dependent: :destroy
accepts_nested_attributes_for :user_profile
# -- Validations --------------------------------------------------------
validates_presence_of :email
validates_presence_of :password
validates_presence_of :password_confirmation
end
UserProfile
модель:
class UserProfile < ApplicationRecord
# -- Relationships --------------------------------------------------------
belongs_to :user
# -- Validations --------------------------------------------------------
validates_presence_of :username
end
Форма регистрации:
= simple_form_for @user do |f|
= render 'devise/shared/error_messages', resource: resource
= f.simple_fields_for :user_profile, :user_profile do |up|
= up.input :username, autocomplete: 'username'
= f.input :email, autocomplete: 'email'
= f.input :password, autocomplete: 'new-password'
= f.input :password_confirmation, autocomplete: 'new-password'
.mt-4.mb-0.col-12
= f.submit t('submit'), class: 'btn btn-primary btn-block'
Обратите внимание, что в представлении я использую simple_form
, но я тестировал то же самое с готовой функциональностью.
Контроллер регистрации:
class Users::RegistrationsController < Devise::RegistrationsController
layout 'unauthenticated_blank', only: [:new, :create]
before_action :configure_sign_up_params
before_action :build_user
protected
def configure_sign_up_params
devise_parameter_sanitizer.permit(:sign_up, keys: [:email, :password, :password_confirmation, user_profile_attributes: [:username]])
end
private
def build_user
@user = User.new
@user.build_user_profile
end
end