2010-08-25 13 views
7

Ich habe ein Formular, mit dem der Benutzer eine Nachricht an eine E-Mail senden kann, und ich möchte die Validierung hinzufügen. Ich habe dafür kein Modell, nur einen Controller. Wie soll ich das in Rails machen?Validierung in Rails ohne Modell

Ich erwog, die Validierung in der Steuerung durchzuführen und die Fehler dem Benutzer anzuzeigen, der das Objekt flash verwendet. Gibt es einen besseren Weg, dies zu tun?

Antwort

6

Der beste Ansatz wäre, Ihr Pseudomodell in eine Klasse einzubinden und die Validierungen dort hinzuzufügen. Der Rails-Weg besagt, dass Sie kein Modellverhalten auf die Controller setzen sollten, die einzigen Validierungen sollten diejenigen sein, die zur Anfrage gehören (Authentifizierung, Autorisierung usw.)

In Rails 2.3+ können Sie ActiveRecord::Validations einschließen , mit dem kleinen Nachteil, dass Sie einige Methoden definieren müssen, die die ActiveRecord-Schicht erwartet. Eine genauere Erklärung finden Sie unter this post. Code unten von dieser Stelle angepasst:

require 'active_record/validations' 

class Email 

    attr_accessor :name, :email 
    attr_accessor :errors 

    def initialize(*args) 
    # Create an Errors object, which is required by validations and to use some view methods. 
    @errors = ActiveRecord::Errors.new(self) 
    end 

    # Required method stubs 
    def save 
    end 

    def save! 
    end 

    def new_record? 
    false 
    end 

    def update_attribute 
    end 

    # Mix in that validation goodness! 
    include ActiveRecord::Validations 

    # Validations! =) 
    validates_presence_of :name 
    validates_format_of :email, :with => SOME_EMAIL_REGEXP 
end 

In Rails3, Sie diejenigen sexy validations zur Verfügung zu haben :)

+0

Süße !!!!!!! – denniss

+0

Einfach wie Kuchen. Danke, wo du nach so etwas suchst. –

+2

Ersetzen Sie für Rails 3 ActiveRecord :: Errors mit ActiveModel :: Errors –

2

Für Rails 3+, sollten Sie ActiveModel::Validations verwenden Rails-Stil Validierungen zu einem regulären Ruby-Objekt hinzufügen .

Von the docs:

Aktiv Modell Validierungen

Bietet einen vollständigen Validation Framework, um Ihre Objekte.

könnte eine minimale Implementierung sein:

class Person 
    include ActiveModel::Validations 

    attr_accessor :first_name, :last_name 

    validates_each :first_name, :last_name do |record, attr, value| 
    record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z 
    end 
end 

, die Sie mit dem vollen Standardvalidierungs Stack bietet, die Sie von Active Record kennen :

person = Person.new 
person.valid?     # => true 
person.invalid?     # => false 

person.first_name = 'zoolander' 
person.valid?     # => false 
person.invalid?     # => true 
person.errors.messages   # => {first_name:["starts with z."]} 

Beachten Sie, dass ActiveModel::Validations fügt automatisch ein Verfahren Fehler zu Ihren Instanzen initialisiert mit einem neuen Objekt ActiveModel::Errors, , so dass Sie dies nicht manuell tun müssen.