Rails - отметьте недопустимые вложенные поля - PullRequest
0 голосов
/ 29 мая 2020

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
...