2011-01-11 12 views
1

Hey alle, ich habe Probleme mit der Validierung, an denen ich in den letzten Tagen gearbeitet habe, ohne Glück. Ich habe ein Modell, bei dem der Benutzer eine URL eingeben muss. Ich habe das in meinem Modell mit den folgenden getan:Rails 3 - Form Validation - Logik zu einem Callback oder Observer?

validates :url, :presence => true 

Wenn ein Benutzer ihre Form vorträgt, ich ihre URL nehmen und öffnen Sie sie mit Nokogiri grundlegende Dinge wie die Webseite Titel zu ziehen. Ich mache das gerade mit meiner Create-Methode im Controller. Code sieht so aus:

def create 
    require 'open-uri' 
    @page = Page.new(params[:page]) 

doc = Nokogiri::HTML(open(@page.url)) 

Das Problem, das ich in laufen, ist, dass, wenn der Benutzer ein leeres Formular eingibt, wird Nokogiri Fehler anzeigt, wie es läuft, obwohl ich versucht habe, das Formular zu validieren.

Meine Frage ist, sollte ich diese Art von Logik zu einem Rückruf oder einem Beobachter bewegen? Ich bin ziemlich neu bei Schienen, aber würde es einen Weg für mich geben, mit meinen Daten/Instanzvariablen von einem Callback/Beobachter zu arbeiten? Ich habe es versäumt, einfach @page zu verwenden, habe mich aber gefragt, ob es einen Weg gibt, den ich in den Callback/Observer weiterleiten soll, wenn diese Art von Logik dort platziert werden soll?

Danke

Antwort

3

Wäre besser, dies in das Modell zu setzen.

Controller-Methode funktioniert so etwas wie

def create 
    @page = Page.new(params[:page]) 
    respond_with @page 
end 

und im Modell haben Sie

class Page < ActiveRecord::Base 
    ... 
    before_save :pull_info_from_url 

    def pull_info_from_url 
    doc = Nokogiri::HTML(open(self.url)) 
    ... 
    end 
end 

der before_save Rückruf nach Validierungen ausgeführt wird, so dass, wenn die Präsenz-Prüfung fehlschlägt, dieser Code nicht tut ausgeführt werden, und das Formular mit Fehlern wird stattdessen angezeigt.

+0

Hey, danke für die Hilfe. Es funktioniert jetzt wie ein Zauber. Ich hatte eine weitere Frage zu Rückrufen, die ich beim Lesen einiger Dokumente nicht finden konnte. Gibt es eine Möglichkeit, dies vor dem Rückruf nur nach der Methode create auszuführen? Wie es aussieht, läuft es auch nach dem Update, bevor es speichert. Ich muss es trennen, also ist es nur nach dem Erstellen, also warum ich ursprünglich die Logik in dieser Methode auf dem Controller hatte. – Kombo

+0

Am Anfang von pull_info_from_url könnte man sagen "zurück, wenn new_record?" was ich glaube, würde dies erreichen. Oder Sie könnten before_create anstelle von before_save verwenden. http://edgeguides.rubyonrails.org/active_record_validations_callbacks.html#available-callbacks enthält weitere Informationen zu Rückrufen und Validierungen. – PerfectlyNormal

Verwandte Themen