Table-less model, validations, rails 3 and formtastic
Antes de Rails 3 y sacar las validaciones a un modulo a aparte había que montar un pequeño pollo para esto, pero ahora es bastante fácil.
Imaginemos que tenemos queremos un formulario de contacto con los campos email y comment, además lo hacemos en formtastic y haml.
# new.html.haml = semantic_form_for(@contact, url: contacts_path, html: { method: :post}) do |f| = f.inputs do = f.input :email = f.input :comment, as: :text = f.buttons do = f.commit_button
En el controlador obviamente tendremos que cargar el @contact y procesar el formulario:
contacts_controller.rb .... def new @contact = Contact.new end def create @contact = Contact.new(params[:contact]) # En vez de guard enviamos el email si va todo bien if @contact.send_mail redirect_to new_contacts_path, notice: "Thansk for your comment" else flash[:error] = "Error" render 'new' end end ....
La gracia viene en el modelo:
class Contact # Incluimos el modulo de validaciones include ActiveModel::Validations # Usamos las validaciones como normalmente validates :email, presence: true validates :comment, presence: true # Hacemos que los attributes puedan ser leido attr_reader :email, :comment # Creamos un metodo para poder incializar el objeto def initialize(options = {}) @email = options[:email] @comment = options[:comment] end # En vez de guardar el formulario lo enviamos por email # además devolver si true o false para saber saber en el # controlador si ha ido todo bien def send_mail if self.valid? ContactMailer.send_contact(self).deliver true else false end end # Los siguientes dos métodos me los pide formtastic, # realmente no se si el form_for también los pide def keys nil end # Este método lo usará para el id en el html del formulario # es suficiente con que lo dejeis a nil def to_key nil end end
Para rematar y validar el formato del email me gusta mucho la gema valid_email.
... validates :email, presence: true, email: true ...
Como veis el código no es nada complicado, pero me gusta como ha quedado y creo que es bastante rails.