2013-10-23 11 views
5

Ich habe ein Modell Listing, dass belongs_to :user. Alternativ Userhas_many :listings. Jeder Eintrag hat ein Kategoriefeld, das es klassifiziert (Hunde, Katzen, usw.). Die User hat auch ein boolesches Feld namens is_premium.Hinzufügen eines Validierungsfehlers mit einem before_save-Callback oder einem benutzerdefinierten Validator?

Hier ist, wie ich die Kategorie bin Validierung ...

validates_format_of :category, 
        :with => /(dogs|cats|birds|tigers|lions|rhinos)/, 
        :message => 'is incorrect' 

Sagen wir, ich möchte nur Premium-Benutzern zu ermöglichen, der Lage sein, Tiger hinzufügen, Löwen und Nashörner. Wie würde ich darüber gehen? Wäre es am besten, es in einer before_save Methode zu machen?

before_save :premium_check 

def premium_check 
    # Some type of logic here to see if category is tiger, lion, or rhino. 
    # If it is, then check if the user is premium. If it's not, it doesn't matter. 
    # If user isn't premium then add an error message. 
end 

Vielen Dank im Voraus!

+0

Nein, es wird nicht funktionieren. Ich schätze, Sie sollten lieber einen benutzerdefinierten Validator verwenden. –

Antwort

8
class Listing < ActiveRecord::Base  
    validate :premium_category 

    private 

    def premium_category 
    if !user.is_premium && %w(tigers lions rhinos).include?(category)) 
     errors.add(:category, "not valid for non premium users") 
    end 
    end 
end 
+0

"UND"? Du meinst "' && '"? –

+0

ja. Antwort ist geändert – usha

+0

Ah ha! Genial. Danke für Ihre Hilfe! – gbdev

2

können Sie verwenden validates_exclusion_of:

validates :category, :exclusion => { 
    :in => ['list', 'of', 'invalid'], 
    :message => 'must not be premium category', 
    :unless => :user_is_premium? 
} 

protected 

def user_is_premium? 
    self.user.premium? 
end 
2

Wenn Sie die BEFORE_SAVE Validierungsfehler hinzufügen tun Sie könnte eine Ausnahme auslösen fügen Sie dann den Fehler in der Steuerung wie folgt aus:

class Listing < ActiveRecord::Base  
    before_save :premium_category 

    private 

    def premium_category 
    if !user.is_premium && %w(tigers lions rhinos).include?(category)) 
     raise Exceptions::NotPremiumUser, "not valid for non premium users" 
    end 
    end 
end 

Dann in Ihrem Controller etwas tun wie:

begin 
    @listing.update(listing_params) 
    respond_with(@listing) 
rescue Exceptions::NotPremiumUser => e 
     @listing.errors.add(:base, e.message) 
     respond_with(@listing)  
end 

Dann in Ihrem/lib Ordner eine Klasse wie folgt hinzu:

module Exceptions 
    class NotPremiumUser < StandardError; end 
end 

Aber in Ihrem Fall, dass ich denke, mit der Validate-Methode eine bessere Lösung ist.

Prost,

Verwandte Themen