Сообщения валидации Rails для has_many через - PullRequest
0 голосов
/ 03 июня 2019

У меня проблемы с доступом к сообщениям проверки для связанной модели при сохранении.Установка заключается в том, что «Запись» может связываться со многими другими записями через «RecordRelation», в которой есть метка, указывающая, что это за отношение, например, запись «ссылается на» или «заменяет» другую:

class Record < ApplicationRecord
  has_many :record_associations
  has_many :linked_records, through: :record_associations
  has_many :references, foreign_key: :linked_record_id, class_name: 'Record'
  has_many :linking_records, through: :references, source: :record
  ...
end

class RecordAssociation < ApplicationRecord
  belongs_to :record
  belongs_to :linked_record, :class_name => 'Record'

  validates :label, presence: true
  ...
end

Создание записи в контроллере выглядит следующим образом:

def create
    # Record associations must be added separately due to the through model, and so are extracted first for separate
    # processing once the record has been created.
    associations = record_params.extract! :record_associations
    @record = Record.new(record_params.except :record_associations)
    @record.add_associations(associations)
    if @record.save
      render json: @record, status: :created
    else
      render json: @record.errors, status: :unprocessable_entity
    end

  end

А в модели:

 def add_associations(associations)
    return if associations.empty? or associations.nil?
    associations[:record_associations].each do |assoc|
      new_association = RecordAssociation.new(
          record: self,
          linked_record: Record.find(assoc[:linked_record_id]),
          label: assoc[:label],
       )
      record_associations << new_association
    end
  end

Единственная проблема с этим заключается в том, что созданная ассоциация как-то неверна.Вместо того, чтобы видеть истинную причину, ошибка, которую я получаю, является проверкой для Записи, т.е.

{"record_associations":["is invalid"]}

Может кто-нибудь предложить способ, которым я мог бы получить подтверждение record_association обратно?Это была бы полезная информация для пользователя.

1 Ответ

1 голос
/ 03 июня 2019

Для вашего примера я бы предпочел перейти с nested_attributes.Тогда вы должны легко получить доступ к ошибкам записиДополнительным преимуществом его использования является удаление пользовательской логики, которую вы написали для такого поведения.

Для получения дополнительной информации проверьте документацию - https://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

...