Posts Tagged ‘rails’

Ruby on Rails Paperclip com I18n

Postado em 18 nov 2009
Categoria(s) I18n, Ruby on Rails

O plugin paperclip não tem suporte para i18n por padrão.

Então vamos implementar isso no braço, talvez não seja a forma mais elegante do mundo, mas funciona.

No seu model:

class Ong < ActiveRecord::Base
  # Paperclip
  has_attached_file :logo, :styles => { :thumb => "100x100>" }
  validates_attachment_size :logo, :less_than => 50.kilobytes, :message => I18n.t('activerecord.errors.messages.attachment_size', :min => 0, :max => 50.kilobytes)
end

Agora você precisar criar a diretiva activerecord.errors.messages.attachment_size no seu config/locales/pt-BR.yml:

pt-BR:
  # Active Record
  activerecord:
    errors:
      template:
        header:
          one: "Não foi possível gravar: 1 erro"
          other: "Não foi possível gravar: {{count}} erros."
        body: "Por favor, verifique o(s) seguinte(s) campo(s):"
      messages:
        attachment_size: "tamanho do arquivo deve estar entre {{min}} e {{max}} bytes"

Pronto! Seja feliz!
Se o plugin não faz, a gente faz.

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark

Ruby on Rails conversão de datas com I18n

Postado em 09 nov 2009
Categoria(s) Ruby on Rails

Eu estou desenvolvendo uma aplicação que precisa trabalhar com datas com I18n e fazer conversões para salvar a data no banco de dados e exibir para o usuário de acordo com o seu idioma.

Eu estou usando o Date Picker do jQuery em um campo do tipo text_field.

datepicker

Vou mostrar um esboço de como eu fiz isso, em primeiro lugar eu defini no arquivo config/environment.rb o idioma:

config.i18n.default_locale = 'pt-BR'

Depois eu defini no arquivo config/locales/pt-BR.yml os formatos de data:

pt-BR:
  date:
    formats:
      default: "%d/%m/%Y"
      short: "%d de %B"
      long: "%d de %B de %Y"
 
    day_names: [Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado]
    abbr_day_names: [Dom, Seg, Ter, Qua, Qui, Sex, Sáb]
    month_names: [~, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro]
    abbr_month_names: [~, Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez]
    order: [ :day, :month, :year ]

No meu formulário eu deixei assim:

<% content_for :javascripts do %>
  <%= include_jquery %>
  <%= javascript_include_tag "jquery.maskedinput-1.2.2.min" %>
  <% javascript_tag do %>
    $(document).ready(function() {
      // Adiciona date picker ao campo data de nascimento
      $.datepicker.setDefaults($.extend({showMonthAfterYear: false}, $.datepicker.regional['<%= I18n.locale %>']));
      $("#investor_date_of_birth").datepicker({
        showOn: 'both',
        buttonImage: '/images/calendar.gif',
        buttonImageOnly: false,
        buttonText: '<%= t('ui.admin.crud.datepicker_button_text') %>',
        changeMonth: true,
        changeYear: true,
        yearRange: '1900:<%= Time.now.year %>'
      });
 
      // Adiciona mascara ao campo data de nascimento
      $("#investor_date_of_birth").mask("99/99/9999");
    });
  <% end %>
<% end %>
 
<% form_for [:admin, @investor] do |f| -%>
  <%= f.error_messages %>
 
  <%= f.label :date_of_birth %>
 
  <% if @investor.new_record? %>
    <%= f.text_field :date_of_birth, :class => "smallInput" %>
  <% else %>
    <%= f.text_field :date_of_birth, :value => l(@investor.date_of_birth, :format => :default), :class => "smallInput" %>
  <% end %>
<% end %>

Caso exista o registro é realizado a conversão para exibir a data corretamente no formulário, não é necessário fazer conversão para salvar no banco de dados, o Rails já faz isso automaticamente.

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark

Ruby on Rails validates_numericality_of para integer ou valores determinados

Postado em 06 nov 2009
Categoria(s) Ruby on Rails

Se a sua aplicação Ruby on Rails trabalha com chaves estrangeiras, relacionamentos, é interessante adicionar algumas validações para que o seu sistema não dê erro 500 por uma tentativa mal intecionada de inserção ou atualização do registro.

Isso também é útil quando você quer delimitar uma faixa de valores válidos para o campo.

Geralmente os campos de chave estrangeira são do tipo integer que pertence ao intervalo de -2147483648 até +2147483647, onde a grande maioria das aplicações trabalha somente com o conjunto dos números N* (naturais sem o zero).

Eu recomendo a seguinte validação no seu model:

class Investor < ActiveRecord::Base
  # Para chaves estrangeiras
  validates_numericality_of [:country_id, :gender_id, :civil_position_id], :greater_than_or_equal_to => 1, :less_than_or_equal_to => 2147483647
  # Para faixa de valor definida
  validates_numericality_of :number_of_dependents, :allow_nil => true, :greater_than_or_equal_to => 0, :less_than_or_equal_to => 9999
end

Desta forma para chaves estrangeiras são apenas aceitos valores de 1 até 2147483647.

Já para a faixa de valor definida você mesmo deve definir, conforme a sua necessidade, no caso do exemplo acima de 0 até 9999.

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark

Ruby on Rails Validação de Data

Postado em 05 nov 2009
Categoria(s) Ruby on Rails

Não existe no core do Ruby on Rails um validator para datas, mas existe um plugin que faz muito bem essa tarefa, o nome do plugin é validates_date_time.

Esse plugin está disponível no Github em: http://github.com/nickstenning/validates_date_time/.

Instalação

./script/plugin install git://github.com/nickstenning/validates_date_time.git

Configuração

class Investor < ActiveRecord::Base
  validates_date :date_of_birth
end

Esse validator aceita datas no formato: 2006-01-01 ou 1 Jan 06 ou 1 Jan 2006 ou 10/1/06 ou 1/1/2006, por padrão o plugin espera datas no formato dia/mês/ano, caso você queria datas no formato americano e necessário adicionar a seguinte linha no seu config/environment.rb:

ValidatesDateTime.us_date_format = true

Outro detalhe é que o validates_date por padrão considera que o campo de data é obrigatório, caso você queria que seu preenchimento seja opcional você pode adicionar o parâmetro :allow_nil => true da seguinte forma:

validates_date :date_of_birth, :allow_nil => true

I18n

Eu procurei na internet uma forma elegante para usar I18n no plugin, eu encontrei apenas uma (http://github.com/nickstenning/validates_date_time/blob/master/test/fixtures/en.yml), mas essa solução não contempla todas as mensagens de validações, existe a mensagem de validação de data inválida que eu não consegui traduzir da forma do link anterior, desta forma eu implementei manualmente o I18n para a mensagem de validação “is an invalid date” da seguinte forma:

No arquivo config/locales/pt-BR.yml adicionei o atributo invalid_date:

pt-BR:
  # Active Record
  activerecord:
    errors:
      messages:
        invalid_date: "é uma data inválida"

e no model eu configurei da seguinte forma:

class Investor < ActiveRecord::Base
  validates_date :date_of_birth, :message => I18n.t('activerecord.errors.messages.invalid_date')
end

O plugin também trabalha com validações time e date time, nos formatos: 1pm ou 10:11 ou 12:30pm ou 8am e 1 Jan 2006 2pm ou 31/1/06 8:30am.

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark

Ruby on Rails Authlogic com I18n para pt-BR

Postado em 01 set 2009
Categoria(s) Ruby on Rails

Para traduzir as mensagens, campos e modelos do Authlogic para pt-BR basta seguir os passos abaixo:

1) Define o default_locale para pt-BR

Abra o arquivo config/environment.rb, descomente a linha e define o idioma para pt-BR:

...
  # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
  # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')]
  config.i18n.default_locale = 'pt-BR'
end

2) Crie o arquivo pt-BR.yml

Dentro do diretório config/locales crie o arquivo pt-BR.yml, e adicione o seguinte conteúdo:

pt-BR:
  # Authlogic
  authlogic:
    error_messages:
      login_blank: "não pode ficar em branco"
      login_not_found: "não é válido"
      login_invalid: "deve usar somente letras, números, espaços e .-_@ por favor."
      consecutive_failed_logins_limit_exceeded: "Consecutivos logins que falharam limite excedido, a conta está desativada."
      email_invalid: "deve ser semelhante a um endereço de email."
      password_blank: "não pode ficar em branco"
      password_invalid: "não é válido"
      not_active: "Sua conta não está ativa"
      not_confirmed: "Sua conta não está confirmada"
      not_approved: "Sua conta não foi aprovada"
      no_authentication_details: "Você não forneceu nenhum detalhe para autenticação."
    models:
      user_session: "SessãoUsuário"
    attributes:
      user_session:
        login: "Usuário"
        email: "Email"
        password: "Senha"
        remember_me: "Lembrar me"

3) Reinicie a aplicação

Para garantir que todas as novas configurações sejam carregadas reinicie o servidor web.

4) Opcional: Instale o plugin para traduzir os labels dos formulários

./script/plugin install git://github.com/iain/i18n_label.git

Pronto!

Uma outra sugestão de leitura é: http://blog.patrickespake.com/2009/01/31/ruby-on-rails-22-como-usar-i18n-traduzir-as-mensagens-de-validacao-do-model-e-atributos-do-model/.

Se você gostou desse texto e acha que ajudou você, me recomende: Recommend Me.

  • Share/Bookmark