Получайте ошибки при создании ассоциаций - PullRequest
1 голос
/ 26 сентября 2019

У меня есть эта проверка в моей app_setting модели:

    class AppSetting < ActiveRecord::Base
      belongs_to :event
      validates :id_monitoring_system, numericality: { only_integer: true }, allow_blank: true
    end

У меня есть контроллер, где я создаю события:

  def create
    @event = Event.new(event_params)

    unless params[:app_setting].nil?
      app_setting = JSON.parse(params[:app_setting])
      @event.build_app_setting(app_setting)
    end

    if @event.save
      render json: {status: 'created', message: 'Event save'}
    else
      render json: {status: false, errors: @event.errors.full_messages}
    end
  end

Я хочу получить проверку app_settingошибки по атрибуту id_monitoring_system и их отображение на мой взгляд

, когда атрибут не является целым числом, ассоциация не создается и не отображает ошибки

Я пытался:

    begin
      unless params[:app_setting].nil?
        app_setting = JSON.parse(params[:app_setting])
        @event.create_app_setting!(app_setting)
      end
    rescue ActiveRecord::RecordInvalid => e
      errors.add(:base, 'id_monitoring_system is integer')
    end

Но это не работает, как я могу это решить?

1 Ответ

1 голос
/ 26 сентября 2019

Проверка определена в AppSetting, поэтому она добавит ошибки в экземпляр класса.Попробуйте это на консоли rails:

s = AppSetting.new(id_monitoring_system: 'foo')
s.valid?
 => false
s.errors.full_messages # should output something like
 => ['id_monitoring_system must be an integer'

В зависимости от того, как вы определили связь между Event и AppSetting в классе Event, это может вызвать ошибку проверки.Я ожидаю, что ассоциация будет определена так:

class Event < ActiveRecord::Base
  has_one :app_setting, required: true

Таким образом, при выполнении:

@event.build_app_setting(id_monitoring_system: 'foo')
@event.save

Это приведет к тому, что AppSetting не пройдёт проверку численности и, в свою очередь, Event потерпит неудачу, потому что требуется ассоциация.Но ошибка, показанная в @event, будет can't be blank.Чтобы показать ошибку проверки AppSetting, необходимо добавить ее к экземпляру ошибок родительского класса

if @event.save
  render json: {status: 'created', message: 'Event save'}
else
  @event.errors.add(:base, @event.app_setting.errors.full_messages)
  render json: {status: false, errors: @event.errors.full_messages}
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...