José Galisteo Ruiz

06/12/2011

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.

blog comments powered by Disqus