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