Проверить: включено с помощью специального метода в контроллере Rails - PullRequest
0 голосов
/ 06 августа 2020

Я хочу выполнить установку / исправление для следующего маршрута, который, в свою очередь, вызывает контроллер баров и вызывает его метод 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:».

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

Ответы [ 2 ]

1 голос
/ 06 августа 2020

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

validate :validate_premium_bars

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

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

0 голосов
/ 06 августа 2020

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

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

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

soruce

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...