Ok, já deve existir um plugin pra isso, mas juro que é fácil.
Evita colocar :message => "..." em toda validação, permite traduzir os atributos dos models, ganha um helper label_for e errors no lugar de error_messages_for. Abaixo os arquivos:

Adicione o seguinte código no seu config/enviroment.rb.

CODE
# Translate default errors messages
ActiveRecord::Errors.default_error_messages = {
  :inclusion => "não esta incluído na lista",
  :exclusion => "é reservado",
  :invalid => "é inválido",
  :confirmation => "não confere confirmação",
  :accepted  => "precisa ser aceito",
  :empty => "não pode ser vazio",
  :blank => "não pode ser branco",
  :too_long => "é muito grande (máximo é %d caracteres)",
  :too_short => "é muito curto (minimo é %d caracteres)",
  :wrong_length => "está com tamanho errado (certo é %d caracteres)",
  :taken => "já foi usado",
  :not_a_number => "não é um número"
};


Edite seu app/helpers/application_helper.rb.

CODE
module ApplicationHelper

  def label_for(object_name, attr, content=nil)
    object = instance_variable_get("@"+object_name.to_s);
    klass = (object) ? object.class : nil;
    unless klass
      begin; klass = object_name.classify.constantize;
      rescue NameError; end
    end
    if klass
      content = klass::AttributesNames[attr.to_sym] || content || attr.to_s;
      id = "#{object_name}_#{attr}";
    else
      content, id = attr, object_name;
    end
    content_tag("label", content, {:for => id});
  end

end


Edite também seu app/controllers/application.rb.

CODE
class ApplicationController < ActionController::Base
  helper_method :errors;
  
  protected
  def errors(obj, opts={})
    opts = {:class => "", :message => ""}.merge(opts);
    klass = " class=#{opts[:class]}" if opts[:class] != "";
    msg = opts[:message] + "<br />" if opts[:message] != "";
    tag = "#{msg}\n<ul#{klass}>\n";
    attrs = obj.class::AttributesNames || {};
    attrs = Hash.new{|hash, key| hash[key] = key.to_s;}.merge(attrs);
    obj.errors.each do |attr, msg|
      tag << "<li>#{attrs[attr.to_sym]} #{msg}</li>\n";
    end
    tag + "</ul>";
  end
  
end


Em seu model, adicione a um hash AttributesNames mapeando cada atributo com seu nome, olhe o exemplo (app/models/user.rb):

CODE
class User < ActiveRecord::Base
  #validates_pres...
  AttributesNames = {
    :fullname => "Nome Completo",
    :username => "Nome De Usuário",
    :password => "Senha",
    :email => "Email"
  };
  
end


Em sua view você pode usar o helper label_for para formulários, os dois primeiros parâmetros são iguais ao text_field (model e atributo), você pode fornecer um terceiro para ele usar como conteúdo do <label> caso não encontre nome correspondente ao atributo fornecido no hash AttributesNames em seu model, se não houver correspondente no hash e nem for fornecido o terceiro parâmetro, ele usara o nome do atributo como conteúdo. Exemplo (app/views/users/new.rhtml):

CODE
<h4>Registrando novo usuário</h4>

<% form_tag :action => "create" do %>

  <fieldset>
    <legend>Pessoal</legend>
    
    <p><%= label_for "user", "fullname" %>
    <%= text_field "user", "fullname", :class => "big" %></p>
    
    <p><%= label_for "user", "email" %>
    <%= text_field "user", "email" %>
    <span class="description">Email válido</span></p>
    
  </fieldset>
  
  <fieldset>
    <legend>Cadastro</legend>
    
    <p><%= label_for "user", "username" %>
    <%= text_field "user", "username" %>
    <span class="description">Em minúsculas, máximo de 20 caracteres</span></p>
    
    <p><%= label_for "user", "password" %>
    <%= password_field "user", "password", :value => "" %>
    <span class="description">Mínimo de 6 caracteres</span></p>
    
    <p><%= label_for "user", "password_confirmation", "Confirma Senha" %>
    <%= password_field "user", "password_confirmation", :value => "" %></p>
    
  </fieldset>
  
  <p class="actions">
    <button type="submit">Cadastrar</button>
    <button type="reset">Limpar</button>
  </p>
  
<% end %>


E em seu controle, ou na view, use o método errors que devolvera uma lista não ordenada com os erros, do objeto fornecido. Exemplo (app/controllers/users_controller.rb):

CODE
class UsersController < ApplicationController
  
  def create
    @user = User.new(params[:user]);
    if @user.save
      flash[:info] = "Bem vindo, #{@user.fullname}!";
      login_user(@user);
      redirect_to :controller => "control";
    else
      flash[:error] = errors @user, :message => "Revise os campos, por favor.";
      redirect_to :back;
    end
  end
  
end


Uma página renderizada com estes códigos:



Flwss

Você gostou? Comente no fórum!

Mais recentes em Ruby

Iniciando no ruby
Por Vinik - Tutoriais by crusty...
Traduzir models
Por Bermonruf - Mensagens de erro e atributos...
Metaprogramação em ruby
Por Bermonruf - Nome: metaprogramação em ruby - autor: bernardo monteiro...
Sistema de arquivos e zip
Por Bermonruf - Criar, ler, deletar diretórios e arquivos...
Ruby básico
Por Bermonruf - From javascript to ruby...

Ver mais Artigos de Ruby.

Ver e retirar outras dúvidas no fórum Webly.

Alguns Direitos Reservados | RSS | O Fórum

Webly Portal e Fóruns - Internet + Humana | Design by ArthurHenrique.com