2016-08-11 2 views
0

Я пытаюсь проверить поле формы в приложении Rails одним из двух способов, в зависимости от переданных параметров. Если у моего объекта есть параметр allow_negative: true, я хочу:ActiveModel Validate form имеет отрицательное значение, если true else validate form имеет положительное значение

validates :amount, numericality: {less_than_or_equal_to: 0} 

в противном случае я хочу:

validates :amount, numericality: {greater_than_or_equal_to: 0} 

Когда я пытаюсь просто сделать это:

validates :amount, numericality: {greater_than_or_equal_to: 0}, unless: :allow_negative 
validates :amount, numericality: {less_than_or_equal_to: 0}, if: :allow_negative 

Он просто выполняет второй экземпляр validates :amount

Для справки, вот весь мой класс:

class ViewModel 
    include ActiveModel::Model 

    validates :description, presence: true 
    validates :amount, numericality: {greater_than_or_equal_to: 0}, unless: :allow_negative 
    validates :amount, numericality: {less_than_or_equal_to: 0}, if: :allow_negative 

    attr_reader :amount 
    attr_reader :description 
    attr_reader :allow_negative 
    attr_reader :order 

    def initialize(user, params) 
     @amount = params[:amount] 
     @description = params[:description] 
     @allow_negative = params[:allow_negative] 
     @order = Order.find(params[:order_id]) 
    end 

    end 

ответ

1

Получается, что вышеуказанные работы переданы фактическим булевым. Я передавал строку истину или ложь. Как только я преобразовал значение allow_negative в настоящий bool, он отлично поработал.

0

Что ваш код делает, принуждая положительные или отрицательные значения, основываясь на состоянии :allow_negative. Было бы точнее называть его :force_negative, используя структуру, которая у вас есть.

Если вы хотите, чтобы значение :allow_negative, чтобы как положительные, так и отрицательные значения, вы хотите что-то вроде этого:

validates :amount, numericality: true 
validates :amount, numericality: {greater_than_or_equal_to: 0}, unless: :allow_negative 
0

Вы можете захотеть сделать пользовательскую проверку, такие как:

class ViewModel 
    include ActiveModel::Model 

    validates :amount, numericality: true 
    validate :force_negative 

    private 

    def force_negative 
    if allow_negative && amount > 0 
     errors.add(:amount, "must be less than or equal to 0") 
    elsif amount < 0 
     errors.add(:amount, "must be greater than or equal to 0") 
    end 
    end 
end