Я хочу поставить / исправить следующий маршрут, который, в свою очередь, вызывает контроллер баров и вызывает его метод update_premium: put '/bar/premium', to: 'bars#update_premium'

Однако этот метод должен вызывать проверку валидации в самой модели всякий раз, когда вызывается .save или .valid? /. Valid.

bar.rb

class Bar < ApplicationRecord
    belongs_to :city
    validate :validate_premium_bars, on: :create
    validate :validate_premium_bars, on: :update_premium

    def allow
        @allow_change = true
    end

    private
    def validate_premium_bars
        return unless self.city
        unless @allow_change
            if self.city.bars.where(:is_premium => true).count >= 5
                errors.add("...")
            end
        end
    end
end

bars_controller.rb

def update_premium
        @bar = Bar.find(params[:id])
        if @bar.save
            ...
        else
            render json: @bar.errors.full_messages, status: 400
        end
end

Это работает, когда я использую on: :update, однако специальный метод в контроллере, такой как on: :update_premium, не работает вместе с символом "on:".

Как я могу это решить? Я хочу сохранить метод обновления в контроллере для реального полного обновления модели, а не только для запуска одного атрибута модели.

0
F. Amg 6 Авг 2020 в 18:16

2 ответа

Лучший ответ

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

validate :validate_premium_bars

Таким образом, он запускается каждый раз, когда вы запускаете valid? или вызывается save вместо добавления определенных условий для create и update.

В случае, если вы по какой-то причине захотите добавить это отдельно. Вы можете добавить проверку для запуска для update и обновить фактический атрибут, используя вызов update или вызов valid? для него после проверки значения, чтобы убедиться, что запись проходит проверки

1
anonn023432 6 Авг 2020 в 17:03

Проблема в том, что действие контроллера update не отображается на действия модели. Один относится к конечной точке, а другой - к событию в жизненном цикле модели. См. официальную документацию о вариантах проверки.

Вы можете создать настраиваемую условную проверку, которая будет запускаться каждый раз при изменении модели. Например:

  validate :validate_premium_bars, if: :allowed_chage?
 
  def allowed_chage?
    @allowed_chage
  end

soruce

0
dev-cc 6 Авг 2020 в 15:32