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.
# 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.
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
endEdite também seu app/controllers/application.rb.
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
endEm seu model, adicione a um hash AttributesNames mapeando cada atributo com seu nome, olhe o exemplo (app/models/user.rb):
class User < ActiveRecord::Base
#validates_pres...
AttributesNames = {
:fullname => "Nome Completo",
:username => "Nome De Usuário",
:password => "Senha",
:email => "Email"
};
endEm 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):
<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):
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
endUma página renderizada com estes códigos:

Flwss

Entrar
Cadastre-se
Ajuda
Responder

Quote