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

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.

Posted in Ruby on Rails at janeiro 31st, 2009. No Comments.

Ruby on Rails validação de CEP

Para fazer a validação de um campo do tipo CEP no model é necessário usar uma expressão regular:

1
validates_format_of :cep, :with => %r{\d{5}(-\d{3})?}

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

Posted in Ruby on Rails at janeiro 31st, 2009. No Comments.

Ruby on Rails validação de e-mail

Para fazer a validação de um campo do tipo e-mail no model é necessário aplicar uma expressão regular:

1
validates_format_of :email, :with => /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i

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

Posted in Ruby on Rails at janeiro 31st, 2009. No Comments.

Ruby on Rails como usar calendar_helper plano para eventos ou filtros

Usando o plugin calendar_helper no Ruby on Rails

Usando o plugin calendar_helper no Ruby on Rails

O calendar_helper é um helper que permite criar calendários planos em HTML.

Eu estou usando ele para exibir todos os eventos cadastrados e permitir que o usuário veja todos os eventos de um determinado mês e os eventos num determinado dia.

Esse helper pode ser encontrado no github: http://github.com/topfunky/calendar_helper/tree/master.

Instalação:

No diretório do projeto:

1
ruby script/plugin install git://github.com/topfunky/calendar_helper.git

Agora adicione os css do calendar_helper na sua pasta public, digite no diretório do projeto:

1
ruby script/generate calendar_styles

Como usar:

Adicione o css do calendar_helper no seu layout:

1
<%= stylesheet_link_tag "calendar/grey/style" %>

Por exemplo, na action index 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
def index
  if params[:month] and params[:year]
    @year = params[:year].to_i
    @month = params[:month].to_i
 
    first = Date.civil(@year, @month, 1)
    last = Date.civil(@year, @month, -1)
 
    @events = Event.paginate :all,
      :conditions => ["(start_date BETWEEN ? AND ?) OR (end_date BETWEEN ? AND ?)", first.to_datetime, last.to_datetime, first.to_datetime, last.to_datetime],
      :page => params[:page]
 
    calendar
  end
end
 
private
 
def calendar
  @list_events_days = events_days(@events)
 
  @next_month = @month
  @next_year  = @year
 
  @previous_month = @month
  @previous_year  = @year
 
  if @month == 12
    @next_month = 1
    @next_year += 1
  else
    @next_month += 1
  end
 
  if @month == 1
    @previous_month = 12
    @previous_year -= 1
  else
    @previous_month -= 1
  end
end
 
def events_days(events)
  list_events_days = []
  events.each do |e|
    start_date = e.start_date.to_date
    end_date = e.end_date.to_date
 
    range = start_date..end_date
    range.each do |d|
      list_events_days << d
    end
  end
 
  return list_events_days
end

O código acima busca todos os eventos cadastrados, define o mês e ano para ser exibido no calendário, também cria a navegação para o próximo mês e o mês anterior.

O método calendar fica responsável por inicializar essas variáveis e fazer algumas verificações para montar corretamente as datas para navegação no calendário.

Já o método events_days é responsável por gerar um array que irá definir uma classe css para estilizar o calendário nos dias que haverá eventos.

Vamos exibir o calendário no template index.html.erb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%= calendar(
  {
    :year => @year,
    :month => @month,
    :previous_month_text => link_to(
      image_tag("icons/previous.png"),
      :action => 'index',
      :month => @previous_month,
      :year => @previous_year),
    :next_month_text => link_to(
      image_tag("icons/next.png"),
      :action => 'index',
      :month => @next_month,
      :year => @next_year)
}) do |d|
  if @list_events_days.include?(d.to_date)
    [link_to(d.mday, :action => 'day', :date => d.to_date), { :class => "specialDay" }]
  end
end
%>

No calendar_helper é obrigatório fornecer os atributos :year e :month, os demais são opcionais.

Com os atributos :previous_month_text e :next_month_text é possível definir um link para o próximo mês e mês anterior, desta forma é possível definir a navegação no calendário.

No final do helper temos:

1
2
3
4
5
...}) do |d|
    if @list_events_days.include?(d.to_date)
      [link_to(d.mday, :action => 'day', :date => d.to_date), { :class => "specialDay" }]
    end
  end

Nessa parte que eu adiciono uma classe css para marcar os dias que tem eventos no calendário, também crio um link para fazer uma navegação de eventos por dia.

Minha action day, para buscar os eventos de um determinado dia ficou assim:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def day
  if params[:date]
    @date = params[:date].to_date
    @year = @date.year
    @month = @date.month
 
    @events = Event.paginate :all,
      :conditions => ["(start_date <= ? and end_date >= ?) OR (start_date BETWEEN ? AND ?) OR (end_date BETWEEN ? AND ?)", @date, @date, "#{@date} 00:00:00", "#{@date} 23:59:59", "#{@date} 00:00:00", "#{@date} 23:59:59"],
      :page => params[:page]
 
    calendar
 
    first = Date.civil(@year, @month, 1)
    last = Date.civil(@year, @month, -1)
 
    events_month = Event.paginate :all,
      :conditions => ["(start_date BETWEEN ? AND ?) OR (end_date BETWEEN ? AND ?)", first.to_datetime, last.to_datetime, first.to_datetime, last.to_datetime],
      :page => params[:page]
 
    @list_events_days = events_days(events_month)
  end
end

Essa action ficou um pouco mais complexa, nela eu tenho que pegar os eventos em um determinado dia, mas também tenho que buscar todos os eventos no mês, assim consigo deixar todos os dias marcados corretamente no calendário.

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

Posted in Ruby on Rails at janeiro 29th, 2009. 1 Comment.

Ruby on Rails gerar intervalo entre duas datas

Hoje eu precisei gerar um intervalo de datas, entre um data inicial e uma data final. Fiquei simplesmente impressionado como é fácil fazer isso no Ruby.

Eu queria gerar todas as datas entre ’2009-01-01′ e ’2009-01-20′, eu abri o IRB e fui aos testes, não é que deu certo de primeira:

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
irb(main):001:0> range = '2009-01-01'..'2009-01-20'
=> "2009-01-01".."2009-01-20"
irb(main):002:0> range.each { |v| puts v }
2009-01-01
2009-01-02
2009-01-03
2009-01-04
2009-01-05
2009-01-06
2009-01-07
2009-01-08
2009-01-09
2009-01-10
2009-01-11
2009-01-12
2009-01-13
2009-01-14
2009-01-15
2009-01-16
2009-01-17
2009-01-18
2009-01-19
2009-01-20
=> "2009-01-01".."2009-01-20"
irb(main):003:0>

Resumindo:

Mando gerar um range:

1
range = '2009-01-01'..'2009-01-20'

No exemplo acima eu usei .. (dois pontos) isso faz com que a data final ’2009-01-20′ seja incluída, caso você não queira incluir a data final use … (três pontos).

Mando imprimir o range:

1
range.each { |d| puts d }

Como eu vivi tanto tempo sem conhecer o Ruby. ;-)

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

Posted in Ruby on Rails at janeiro 29th, 2009. 1 Comment.

Ruby on Rails como criar permalink

Algo muito importante é gerar urls amigáveis e permanentes para sua aplicação web, isso melhora a indexação pelos mecanismos de busca e deixa os endereços mais compreensíveis para o usuário.

Para trabalhar com permalinks eu gosto do plugin has_permalink: http://github.com/fnando/has_permalink/tree/master.

Instalação:

No diretório do projeto:

1
ruby script/plugin install git://github.com/fnando/has_permalink.git
1
sudo gem install unicode

Forma de usar:

O permalink será gerando em cima de uma coluna da sua tabela, onde você especifica qual é a coluna. Também necessário ter uma coluna chamada permalink na sua tabela e no seu model, nessa coluna que será armazendo o permalink gerado.

Por exemplo, digamos que você tenha um model chamado Institutional, o arquivo de migração poderia ter a seguinte estrutura:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class CreateInstitutionals < ActiveRecord::Migration
  def self.up
    create_table :institutionals do |t|
      t.string :title, :limit => 150, :null => false
      t.text :content, :null => false
      t.string :permalink
      t.timestamps
    end
  end
 
  def self.down
    drop_table :institutionals
  end
end

É necessário o atributo t.string :permalink para funcionar.

Agora no model é necessário adicionar has_permalink, isso vai especificar em cima de qual coluna será gerado o permalink:

1
2
3
class Institutional < ActiveRecord::Base
  has_permalink :title
end

Se você precisar criar permalinks onde o nome pode duplicar é necessário sobrescrever o método to_param no model:

1
2
3
4
5
6
7
class Institutional < ActiveRecord::Base
  has_permalink :title
 
  def to_param
    "#{id}-#{permalink}"
  end
end

Desta forma os permalinks sempre serão gerados com id na frente.

Para gerar os links na view eu faço o seguinte:

1
<%= link_to h(institutional.title), :controller => :institutionals, :action => :show, :permalink => institutional.permalink %>

Para pegar o objeto no controller eu faço o seguinte:

1
2
3
def show
  @institutional = Institutional.find_by_permalink(params[:permalink])
end

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

Posted in Ruby on Rails at janeiro 27th, 2009. 1 Comment.

FLV Mime Type application/x-flash-video

Desenvolvi um sistema de upload de vídeos no formato FLV, sofri um pouco para descobrir o tipo do Mime Type dos arquivos .flv, por fim descobri que o mime type é o seguinte:

1
application/x-flash-video

Estou usando o PaperClip para fazer upload de arquivos .flv só por garantia eu adicionei outros mime types na validação do meu model:

1
validates_attachment_content_type :video, :content_type => ['application/x-shockwave-flash', 'application/x-shockwave-flash', 'application/flv', 'video/x-flv', 'application/x-flash-video']

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

Posted in Ruby on Rails at janeiro 25th, 2009. No Comments.

Ruby on Rails selecionando registros randomicamente (Random)

Digamos que você queira exibir banners aleatórios na home da sua aplicação, você poderia fazer algo assim:

1
2
3
4
5
6
7
8
class HomeController < ApplicationController
 
  def index
    offset = rand(Banner.count(:all, :conditions => "is_active IS TRUE"))
    @banner = Banner.find :first, :conditions => "is_active IS TRUE", :offset => offset
  end
 
end

Acredito que dessa forma funcione em todos os banco de dados.

Existe outras formas de seleção randômica de registros através de order by, mas isso muda de banco de dados para banco de dados, para enteder mais leia: http://wiki.rubyonrails.org/rails/pages/HowtoSelectRandomRecords.

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

Posted in Ruby on Rails at janeiro 23rd, 2009. No Comments.

Ruby on Rails Plugin LightBox

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.

Posted in Ruby on Rails at janeiro 23rd, 2009. No Comments.

Ruby on Rails validates_format_of para urls e links

Para validar uma url ou link no Rails deve-se usar o validates_format_of.

1
validates_format_of :link, :with => /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$/ix, :allow_nil => true, :allow_blank => true

Eu adicionei mais duas opções :allow_nil => true e :allow_blank => true, se o valor do campo for nulo ou vazio não é realizada a validação do link ou url.

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

Posted in Ruby on Rails at janeiro 23rd, 2009. No Comments.
 Assinar RSS Feed