2016-08-11 4 views
0

渡されたパラメータに応じて、Railsアプリケーションでフォームフィールドを検証する方法が2つあります。オブジェクトにparam allow_negative: trueは、私がしたい:ActiveModelフォームが正の値の場合は負の値を持ちますその他の場合は正の値を持つフォーム

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 
を10

は、それはちょうどここで、参考のためvalidates :amount

の2番目のインスタンスを実行し、私のクラス全体である:

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の値を真のブールに変換すると、うまくいった。

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 
関連する問題