Posts Tagged ‘script’

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 usando o jQuery ao invés do Prototype

Postado em 09 jun 2009
Categoria(s) Ruby on Rails, jQuery

Eu gosto mais do jQuery acho ele mais leve, mais funcional e com efeitos melhores.

Vou mostrar como substituir o Prototype e colocar o jQuery no seu lugar.

Instalação do plugin jRails:

ruby script/plugin install http://ennerchi.googlecode.com/svn/trunk/plugins/jrails

No layout da sua aplicação remova o uso do Prototype, remova a linha abaixo, caso ela exista:

<%= javascript_include_tag :defaults %>

Agora adicionei as bibliotecas javascripts entre as tags heads:

...
  <head>
    ...
    <%= javascript_include_tag "jquery" %>
    <%= javascript_include_tag "jquery-ui" %>
    <%= javascript_include_tag "jrails" %>
  </head>
...

Pronto! Fazendo isso o jQuery está disponível e compatível com o Ruby on Rails, ou seja, todos os helpers javascript usarão agora o jQuery como framework javascript.

O plugin jRails sobrescreve os helpers javascript para usar o jQuery.

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

  • Share/Bookmark

Ruby on Rails traduzir rotas com I18n

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

A partir da versão 2.2 do Ruby on Rails existe o plugin TranslateRoutes (http://github.com/raul/translate_routes/tree/master), esse plugin tem o objetivo de traduzir as suas rotas para vários idiomas.

Instalação:

1
ruby script/plugin install git://github.com/raul/translate_routes.git

Configuração:

No diretório config/locales crie um arquivo chamado i18n-routes.yml, nesse arquivo ficarão as traduções das urls:

1
2
3
4
5
pt-BR:
  new: "novo"
  edit: "editar"
  show: "exibir"
  users: "usuarios"

Esse plugin consegue trabalhar com rotas RESTFul e rotas padrões, desta forma você pode traduzir os paths como new, edit, show e users que representam uma rota RESTFul.

Agora é necessário habilitar o sistema de rotas para trabalhar com I18n, edite o arquivo routes.rb e adicionei a seguinte linha ActionController::Routing::Translator.i18n no final:

1
2
3
4
5
6
7
8
ActionController::Routing::Routes.draw do |map|
  map.resources :users
 
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end
 
ActionController::Routing::Translator.i18n

Para mais informações: http://github.com/raul/translate_routes/tree/master.

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

  • Share/Bookmark

Ruby on Rails 2.2 como usar I18n, traduzir as mensagens de validação do model e atributos do model

Postado em 31 jan 2009
Categoria(s) Ruby on Rails

No Ruby on Rails 2.2 existe o suporte para I18n, ou seja, criar aplicações para múltiplos idiomas.

Vou mostrar como habilitar isso no Ruby on Rails 2.2.

Primeiro pare a sua aplicação.

Abra o arquivo environment.rb localizado no diretório config, nesse arquivo procure pela seguinte linha:

1
# config.i18n.default_locale = :de

Ela está comentada e até esse momento o idioma padrão do projeto e o inglês.

Remove o comentário dessa linha e defina o idioma padrão para “pt-BR”:

1
2
3
4
# The internationalization framework can be changed to have another default locale (standard is :en) or more load paths.
# All files from config/locales/*.rb,yml are added automatically.
# config.i18n.load_path << Dir[File.join(RAILS_ROOT, 'my', 'locales', '*.{rb,yml}')]
config.i18n.default_locale = "pt-BR"

Agora precisamos criar um arquivo chamado pt-BR.yml, nesse arquivo irá ficar as traduções dos termos do projeto para o português.

Crie o arquivo pt-BR.yml no diretório config/locales, esse diretório config/locales é responsável por armazenar todos os arquivos de tradução do projeto.

Adicione o seguinte conteúdo no arquivo pt-BR.yml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
pt-BR:
  # formatos de data e hora
  date:
    formats:
      default: "%d/%m/%Y"
      short: "%d de %B"
      long: "%d de %B de %Y"
      only_day: "%d"
 
    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]
 
  time:
    formats:
      default: "%A, %d de %B de %Y, %H:%M hs"
      time: "%H:%M hs"
      short: "%d/%m, %H:%M hs"
      long: "%A, %d de %B de %Y, %H:%M hs"
      only_second: "%S"
      datetime:
        formats:
          default: "%Y-%m-%dT%H:%M:%S%Z"
    am: ''
    pm: ''
 
  # date helper distanci em palavras
  datetime:
    distance_in_words:
      half_a_minute: 'meio minuto'
      less_than_x_seconds:
        one: 'menos de 1 segundo'
        other: 'menos de {{count}} segundos'
 
      x_seconds:
        one: '1 segundo'
        other: '{{count}} segundos'
 
      less_than_x_minutes:
        one: 'menos de um minuto'
        other: 'menos de {{count}} minutos'
 
      x_minutes:
        one: '1 minuto'
        other: '{{count}} minutos'
 
      about_x_hours:
        one: 'aproximadamente 1 hora'
        other: 'aproximadamente {{count}} horas'
 
      x_days:
        one: '1 dia'
        other: '{{count}} dias'
 
      about_x_months:
        one: 'aproximadamente 1 mês'
        other: 'aproximadamente {{count}} meses'
 
      x_months:
        one: '1 mês'
        other: '{{count}} meses'
 
      about_x_years:
        one: 'aproximadamente 1 ano'
        other: 'aproximadamente {{count}} anos'
 
      over_x_years:
        one: 'mais de 1 ano'
        other: 'mais de {{count}} anos'
 
  # numeros
  number:
    format:
      precision: 3
      separator: ','
      delimiter: '.'
    currency:
      format:
        unit: 'R$'
        precision: 2
        format: '%u %n'
        separator: ','
        delimiter: '.'
    percentage:
      format:
        delimiter: '.'
    precision:
      format:
        delimiter: '.'
    human:
      format:
        precision: 1
        delimiter: '.'
  support:
    array:
      sentence_connector: "e"
      skip_last_comma: true
 
  # Active Record
  activerecord:
    errors:
      template:
        header:
          one: "{{model}} não pôde ser salvo: 1 erro"
          other: "{{model}} não pôde ser salvo: {{count}} erros."
        body: "Por favor, cheque os seguintes campos:"
      messages:
        inclusion: "não está incluso na lista"
        exclusion: "não está disponível"
        invalid: "não é válido"
        confirmation: "não bate com a confirmação"
        accepted: "precisa ser aceito"
        empty: "não pode ser vazio"
        blank: "não pode ser vazio"
        too_long: "é muito longo (não mais do que {{count}} caracteres)"
        too_short: "é muito curto (não menos do que {{count}} caracteres)"
        wrong_length: "não é do tamanho correto (precisa ter {{count}} caracteres)"
        taken: "não está disponível"
        not_a_number: "não é um número"
        greater_than: "precisa ser maior do que {{count}}"
        greater_than_or_equal_to: "precisa ser maior ou igual a {{count}}"
        equal_to: "precisa ser igual a {{count}}"
        less_than: "precisa ser menor do que {{count}}"
        less_than_or_equal_to: "precisa ser menor ou igual a {{count}}"
        odd: "precisa ser ímpar"
        even: "precisa ser par"

Esse arquivo pt-BR.yml foi retirado de: http://github.com/svenfuchs/rails-i18n/tree/master nesse endereço você poderá encontrar traduções para outros idiomas.

Pronto! Agora é só rodar a aplicação e ver as mensagens e o restante traduzido para o português.

1
ruby script/server

Outro detalhe super importante e gera muitas perguntas nas listas e fóruns, é como traduzir os nomes dos atributos do model, por exemplo eu tenho um model com os seguintes atributos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CreateHistories < ActiveRecord::Migration
  def self.up
    create_table :histories do |t|
      t.string :title, :limit => 150, :null => false
      t.string :permalink, :limit => 255
      t.text :content, :null => false
      t.timestamps
    end
 
    add_index(:histories, :permalink, :unique => true)
  end
 
  def self.down
    drop_table :histories
  end
end

Eu tenho os atributos title, permalink e content, muitas pessoas como eu gostam de programar tudo em inglês.

O problema é quando é exibida as mensagens de validação, os nomes dos atributos vem todos em inglês, por exemplo:

1
2
3
4
5
6
2 erros para history
 
Foram detectados os seguintes erros:
 
    * Title não pode ser vazio
    * Content não pode ser vazio

Para resolver esse problema e ser feliz, existe um outro plugin chamado activerecord_i18n_defaults que pode ser encontrado aqui: http://github.com/dcrec1/activerecord_i18n_defaults/tree/master.

Vamos usar ele.

Instalação

No diretório raiz do projeto digite:

1
ruby script/plugin install git://github.com/dcrec1/activerecord_i18n_defaults.git

Agora lembra do arquivo pt-BR.yml que criamos acima, vamos abrir ele e inserir novas traduções para os atributos do model.

Procure no arquivo pt-BR.yml por essa parte:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
...
# Active Record
  activerecord:
    errors:
      template:
        header:
          one: "model não pôde ser salvo: 1 erro"
          other: "model não pôde ser salvo: count erros."
        body: "Por favor, cheque os seguintes campos:"
      messages:
        inclusion: "não está incluso na lista"
        exclusion: "não está disponível"
        invalid: "não é válido"
        confirmation: "não bate com a confirmação"
        accepted: "precisa ser aceito"
        empty: "não pode ser vazio"
        blank: "não pode ser vazio"
        too_long: "é muito longo (não mais do que count caracteres)"
        too_short: "é muito curto (não menos do que count caracteres)"
        wrong_length: "não é do tamanho correto (precisa ter count caracteres)"
        taken: "não está disponível"
        not_a_number: "não é um número"
        greater_than: "precisa ser maior do que count"
        greater_than_or_equal_to: "precisa ser maior ou igual a count"
        equal_to: "precisa ser igual a count"
        less_than: "precisa ser menor do que count"
        less_than_or_equal_to: "precisa ser menor ou igual a count"
        odd: "precisa ser ímpar"
        even: "precisa ser par"

Adicione o seguinte conteúdo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
...
  # Active Record
  activerecord:
    attributes:
      _all:
        created_at: "Data de criação"
        updated_at: "Data de atualização"
      history:
        title: "Título"
        content: "Conteúdo"
    errors:
      template:
        header:
          one: "model não pôde ser salvo: 1 erro"
          other: "model não pôde ser salvo: count erros."
        body: "Por favor, cheque os seguintes campos:"
      messages:
        inclusion: "não está incluso na lista"
        exclusion: "não está disponível"
        invalid: "não é válido"
        confirmation: "não bate com a confirmação"
        accepted: "precisa ser aceito"
        empty: "não pode ser vazio"
        blank: "não pode ser vazio"
        too_long: "é muito longo (não mais do que count caracteres)"
        too_short: "é muito curto (não menos do que count caracteres)"
        wrong_length: "não é do tamanho correto (precisa ter count caracteres)"
        taken: "não está disponível"
        not_a_number: "não é um número"
        greater_than: "precisa ser maior do que count"
        greater_than_or_equal_to: "precisa ser maior ou igual a count"
        equal_to: "precisa ser igual a count"
        less_than: "precisa ser menor do que count"
        less_than_or_equal_to: "precisa ser menor ou igual a count"
        odd: "precisa ser ímpar"
        even: "precisa ser par"

Ou seja, adicionei:

1
2
3
4
5
6
7
    attributes:
      _all:
        created_at: "Data de criação"
        updated_at: "Data de atualização"
      history:
        title: "Título"
        content: "Conteúdo"

Tudo que fica abaixo do atributo _all, no caso created_at e updated_at são atributos do model comuns entre vários models, você define ali e todo mundo que tiver esses atributos já serão traduzidos.

E a parte abaixo são atributos específicos do model history:

1
2
3
      history:
        title: "Título"
        content: "Conteúdo"

O bom de existir a parte com _all é que você não precisa ficar duplicando traduções, é o que as pessoas xaropes, manés e viciadas em acrónimos da informática chamam de DRY (o mundo seria bem melhor sem essas pessoas ;-)).

Eu percebi que a gem Brazilian Rails gera alguns conflitos nas mensagens de validações, por isso eu sugiro que você desabilite deixando o seu environment.rb assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
...
  # Specify gems that this application depends on.
  # They can then be installed with "rake gems:install" on new installations.
  # You have to specify the :lib option for libraries, where the Gem name (sqlite3-ruby) differs from the file itself (sqlite3)
  # config.gem "bj"
  # config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
  # config.gem "sqlite3-ruby", :lib => "sqlite3"
  # config.gem "aws-s3", :lib => "aws/s3"
  # config.gem "brazilian-rails", :version => '2.0.13'
  config.gem "brcep", :version => '2.0.13'
  config.gem "brcpfcnpj", :version => '2.0.13'
  config.gem "brdata", :version => '2.0.13'
  config.gem "brdinheiro", :version => '2.0.13'
  config.gem "brhelper", :version => '2.0.13'
  config.gem "brnumeros", :version => '2.0.13'
  config.gem "brstring", :version => '2.0.13'
  # config.gem "brtraducao", :version => '2.0.13'
...

Mais informações: http://iain.nl/2008/09/translating-activerecord/.

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

  • Share/Bookmark

Ruby on Rails Plugin LightBox

Postado em 24 jan 2009
Categoria(s) Ruby on Rails

Conheço um plugin bacana para o Rails para trabalhar com Lightbox, ele usa as seguintes bibliotecas javascripts: http://www.huddletogether.com/projects/lightbox2/.

Para instalar o plugin execute o comando abaixo no diretório da sua aplicação:

1
ruby script/plugin install git://github.com/Lipsiasoft/lightbox.git

No layout da sua aplicação adicione a linha abaixo entre as tags …, por exemplo application.html.erb:

1
<%= yield :stylesheet %>

Agora nos templates onde você deseja usar o lightbox, adicione o css necessário, por exemplo show.html.erb:

1
2
3
<% content_for(:stylesheet) do %>
  <%= stylesheet_link_tag 'lightbox' %>
<% end %>

Esse plugin tem dois helpers lightbox_link_to (para trabalhar com links) e lightbox_image_tag (para trabalhar em cima de um thumbnail):

1
2
3
<%= lightbox_link_to "Link Name", "/path/of/your/image.png" %>
ou
<%= lightbox_image_tag("/path/of/your/image-thumb.png", "/path/of/your/image.png", {:class=>"images"}, :title => "This is a test!") %>

Até mais! :-)

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

  • Share/Bookmark