2010-08-25 14 views
7

Tengo un formulario que permite al usuario enviar un mensaje a un correo electrónico y deseo agregarle validación. No tengo un modelo para esto, solo un controlador. ¿Cómo debo hacer esto en Rails?Validación en rieles sin modelo

Estaba considerando realizar la validación en el controlador y mostrar los errores al usuario que utiliza el objeto flash. ¿Hay una mejor manera de hacer esto?

Respuesta

6

El mejor enfoque sería cerrar su pseudo-modelo en una clase y agregar las validaciones allí. La forma Rails indica que no debe poner el comportamiento del modelo en los controladores, las únicas validaciones deben ser las que acompañan a la solicitud (autenticación, autorización, etc.)

En Rails 2.3+, puede incluir ActiveRecord::Validations , con el pequeño inconveniente de que debe definir algunos métodos que espera la capa ActiveRecord. Vea this post para una explicación más profunda. Código de abajo adaptado del mensaje:

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 

En Rails3, usted tiene los sexy validations a su disposición :)

+0

dulzura !!!!!!! – denniss

+0

Fácil como un pastel. Gracias, en busca de algo como esto. –

+2

Para Rails 3, reemplace ActiveRecord :: Errors with ActiveModel :: Errors –

2

para los carriles 3+, se debe utilizar ActiveModel::Validations añadir validaciones de estilo rieles a un objeto de regular de Rubí .

De the docs:

activo Modelo validaciones

Proporciona un marco de validación completo a los objetos.

Una implementación mínima podría ser:

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 

que le proporciona la pila de validación completo estándar que sabe desde Active Record:

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."]} 

Tenga en cuenta que ActiveModel::Validations añade automáticamente un método de errores a sus instancias inicializadas con un nuevo objeto ActiveModel::Errors, , por lo que no es necesario que haga esto manualmente.

Cuestiones relacionadas