5 Stimmen

Rails 3: Anzeige von Validierungsfehlern für ein Formular (kein Speichern eines ActiveRecord-Modells)

Entschuldigen Sie, wenn dies eine wirklich gemeinsame und / oder lächerliche Frage ist; Ich schwöre, ich habe über die Dokumentation mehrere Male gelesen und alles scheint so konzentriert auf ActiveRecord zu dem Punkt, den sie aus dem Weg der Formulare, die etwas anderes als erstellen oder bearbeiten Modelldaten tun gewandert sind.

Nehmen Sie zum Beispiel ein Formular mit Eingaben zur Steuerung der Extraktion und Anzeige einiger Statistiken. Was bietet mir Rails für die Validierung der Benutzereingaben in diesem Formular, das nicht die save auf irgendwelchen Aufzeichnungen? Dinge wie:

  • :email muss eine E-Mail Adresse sein
  • :num_products muss eine positive ganze Zahl sein
  • :gender muss eines von "M" oder "F" sein
  • :temperature muss zwischen -10 und 120 liegen

usw. usw. (die Art von Dingen, die in den meisten Web-Frameworks standardmäßig enthalten sind)...

Gibt es etwas in Rails für mich diese beliebige Validierung und einige Ansicht-Helfer, um eine Liste der Fehler anzuzeigen, oder ist alles mit ActiveRecord gekoppelt?

Entschuldigung, falls ich dies in der Dokumentation übersehen habe, aber este y este decken es nicht wirklich ab, zumindest soweit meine müden Augen es erkennen können.

kratzt sich am Kopf

Dank der Antwort von Rob habe ich mir folgendes ausgedacht. Ich habe eine Utility-Klasse erstellt (treffend benannt Validator ), die einfach in meine Controller eingebettet ist, für alles, was sie benötigt.

module MyApp

    class Validator
        include ActiveModel::Validations
        include ActiveModel::Conversion
        extend  ActiveModel::Naming

        def initialize(attributes = {})
            super
            attributes.each { |n, v| send("#{n}=", v) if respond_to?("#{n}=") }
        end
    end

end

Definieren Sie zum Beispiel im Controller einfach eine kleine Inline-Klasse:

class LoginController < ApplicationController
    class AuthenticationValidator < MyApp::Validator
        attr_accessor :email
        attr_accessor :password
        validates_presence_of :email, :message => "E-mail is a required field"
        validates_presence_of :password, :message => "Password cannot be blank"
    end

    def authenticate
        if request.post?
            @validator = AuthenticationValidator.new(params)
            if @validator.valid?
                # Do something meaningful
            end
        end
    end

Es erscheint ein wenig unnötig, jeden einzelnen Satz von Validierungsregeln in eine eigene .rb wenn die Logik mehr auf den Controller ausgerichtet ist, IMHO. Es gibt wahrscheinlich einen prägnanteren Weg, dies zu schreiben, aber ich bin ziemlich neu in Ruby und Rails.

6voto

Rob Di Marco Punkte 40364

Ja, das ist ziemlich einfach.

Sie können die Validierungen API für sie.

Hier ein Beispiel für ein Kontaktmodell, das ich für eine Anwendung verwende, die nicht mit ActiveRecord arbeitet.

class ContactUs
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :name, :email, :subject, :message
  validates_presence_of :name, :email, :message, :subject
  validates_format_of :email, :with => /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\z/
  def initialize(attributes=nil)
    attributes.each do |name, value|
      send("#{name}=", value)
    end unless attributes.nil?
  end

  def persisted?
    false
  end
end

0voto

sparrovv Punkte 6124

Es gibt eine gültige Methode im Modell, die eine Validierung auslöst.

Versuchen Sie also statt model.save model.valid?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X