2012-01-17 13 views
5

Voglio che gli attributi del mio modello UserPrice vengano impostati su 0 se sono vuoti o se non ne convalida la numericità. Questi attributi sono tax_rate, shipping_cost e price.Rendi gli attributi predefiniti a 0 se vuoto o se non convalida la numericità

class CreateUserPrices < ActiveRecord::Migration 
    def self.up 
    create_table :user_prices do |t| 
     t.decimal :price, :precision => 8, :scale => 2 
     t.decimal :tax_rate, :precision => 8, :scale => 2 
     t.decimal :shipping_cost, :precision => 8, :scale => 2 
    end 
    end 
end 

In un primo momento, ho messo :default => 0 all'interno della tabella per tutte le 3 colonne, ma non volevo che perché già aveva i campi compilati e voglio usare segnaposti. Qui è il mio modello UserPrice:

class UserPrice < ActiveRecord::Base 
    attr_accessible :price, :tax_rate, :shipping_cost 
    validates_numericality_of :price, :tax_rate, :shipping_cost 
    validates_presence_of :price 
end 

RISPOSTA

before_validation :default_to_zero_if_necessary, :on => :create 

private 

def default_to_zero_if_necessary 
    self.price = 0 if self.price.blank? 
    self.tax_rate = 0 if self.tax_rate.blank? 
    self.shipping_cost = 0 if self.shipping_cost.blank? 
end 

risposta

3

In questo caso avrei probabilmente impostato: impostazione predefinita => 0,: nil => false nelle migrazioni db.

class CreateUserPrices < ActiveRecord::Migration 
    def self.up 
    create_table :user_prices do |t| 
     t.decimal :price, :precision => 8, :scale => 2, :default => 0, :nil => false 
     t.decimal :tax_rate, :precision => 8, :scale => 2, :default => 0, :nil => false 
     t.decimal :shipping_cost, :precision => 8, :scale => 2, :default => 0, :nil => false 
    end 
    end 
end 

Io uso attributo normalizzatore quando si ha a che fare cose più avanzate come la formattazione di un numero di telefono https://github.com/mdeering/attribute_normalizer. Il normalizzatore degli attributi è davvero ottimo per garantire il formato dei dati.

# here I format a phone number to MSISDN format (004670000000) 
normalize_attribute :phone_number do |value| 
    PhoneNumberTools.format(value) 
end 

# use this (can have weird side effects) 
normalize_attribute :price do |value| 
    value.to_i 
end 

# or this. 
normalize_attribute :price do |value| 
    0 if value.blank? 
end 
5

Probabilmente si può solo metterlo in un'azione before_validation ciclo di vita:

before_validation :default_to_zero_if_necessary 

private 
    def default_to_zero_if_necessary 
    price = 0 if price.blank? 
    tax_rate = 0 if tax_rate.blank? 
    shipping_cost = 0 if shipping_cost.blank? 
    end 

Non è necessario verificare se l'input è una stringa dal Rails sarà di default a 0 in questo scenario in ogni modo . Se hai solo bisogno di questa convalida durante l'azione create, puoi cambiarla in:

before_validation :default_to_zero_if_necessary, :on => :create 
Problemi correlati