Webly: Traduzir Models - Webly

Ir para

IMPORTANTE: Todos os tutoriais postados neste fórum irão automaticamente para o portal Webly. Contribua você também e faça parte da equipe de colaboradores que fazem a evolução da web. Obrigado.


Página 1 de 1

Traduzir Models Mensagens De Erro E Atributos Avaliar tópico: -----

#1 Membro offline   Bermonruf Ícone

  • Bernardo Rufino
  • Ícone
  • Grupo: Moderadores
  • Posts: 762
  • Cadastrado: 04-outubro 06
  • Localização:Rio de Janeiro, RJ
  • Interesses:Ruby On Rails, PHP, Javascript, Ajax, CSS, XHTML, DOM, XML

Ícone  Postou 11 agosto 2007 - 05:24

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.

# 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

end


Edite 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
  
end


Em 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"
  };
  
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):

<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
  
end


Uma página renderizada com estes códigos:

Imagem


Flwss
Blog: http://bermonruf.wordpress.com
0

Página 1 de 1


Resposta rápida

  

1 usuário(s) está(ão) lendo este tópico
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)