2016-07-22 4 views
0

Es gibt eine Handvoll Wörter, die niemals in einem Stringattribut in meiner Webanwendung angezeigt werden können (Foto [: title], Benutzer [: name] usw.). Der folgende Code funktioniert in meinem Controller:Verwandeln Sie diesen einfachen Controller-Code in eine Methode

PhotosController 
    def create 
    @photo = current_user.photos.build(photo_params) 
    if @photo.title.include? "foo" 
     @photo = nil 
     flash[:warning] = "Photo failed!, restricted words" 
     redirect_to new_photo_path 
    else 
     if @photo.save 
     flash[:success] = "Photo created!" 
     redirect_to new_photo_path 
     else 
     flash[:warning] = "Photo failed!" 
     redirect_to new_photo_path 
     end 
    end 
end 

Offensichtlich will ich mich nicht haben für jeden String Attribut endlos in meinem Controller zu wiederholen. Ich muss eine Methode erstellen, die in application.rb platziert und über alle meine Controller verwendet werden kann.

+0

Das erste, was Sie tun, ist könnte Titel Validierung Modell zu machen, alle Validierungen immer in Modell getan werden sollte und nie in der Steuerung. –

Antwort

1
class Photo 
    validate :title_with_foo 

    def title_with_foo 
     errors.add(:base, 'Photo failed!, restricted word') unless title.include? "foo" 
    end 
    end 

eine Modellebene Validierung wie hinzufügen oben

+0

danke. Ich sehe das jetzt im Rails Guide. http://guides.rubyonrails.org/active_record_validations.html#validates-with es sieht so aus, als könnte ich das [: fields] -Beispiel zum DRY verwenden, so dass ich diese Validierungen nicht einzeln erstellen muss. Außerdem sollte deine Antwort "wenn" sein, nicht "außer" ... ich arbeite jetzt an der Implementierung des [: fields] Beispiels ... –

Verwandte Themen