# Exemplo do uso de rotas polimórficas para gerar a URL à partir
# da classe de um modelo
polymorphic_url(Comment) # é equivalente ao comments_url()
# => "http://example.com/comments"
Agora ao criar um novo plugin para o Rails você pode adicionar suporte a internacionalização de uma forma bem simples. Basta adicionar seus arquivos de localização no diretório config/locales/**/*.{rb,yml} dentro do diretório principal do seu plugin.
Não tem muito mais o que dizer a respeito desta novidade, mas como eu estava com saudade desta série do blog resolvi voltar com algo bem simples.
Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.3.4 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades acompanhando a série Edge Rails.
Embora o Ruby 1.9 já tenha sido liberado há algum tempo, infelizmente ele ainda é inacessível para muitos de nós, já que muitos projetos foram iniciados em versões mais antigas do Rails, quando ele ainda era incompatível com esta nova versão do Ruby. E mesmo aqueles que estão utilizando as versões mais recentes do Rails, também precisam tomar certos cuidados já que nem todos os plugins e gems já foram preparados e testados para serem executados nesta versão do Ruby.
Já faz um tempo que o core team do Rails vêm aceitando patches que implementam certos recursos presentes apenas no Ruby 1.9, permitindo que mesmo projetos rodando sob as versões 1.8.x também possam se beneficiar destas novas funcionalidades. Uma dessas novidades que recentemente foi incluída na versão de desenvolvimento do Rails (Edge Rails) e que estará presente no próximo release, foi o novo sistema de interpolação de Strings do Ruby 1.9.
Atualmente utilizamos muito o conhecido #{} para realizar esta atividade, como demonstrado no exemplo abaixo.
firstname = "Carlos"
familyname = "Brando"
puts " "
# => "Carlos Brando"
No Ruby 1.9, além da forma exibida acima, também podemos utilizar %{} para informar os valores a serem interpolados através de um objeto do tipo Hash. Seguindo a seguinte sintaxe:
person = {:firstname => "Carlos", :familyname => "Brando"}
puts "%{firstname} %{familyname}" % person
# => "Carlos Brando"
Se você gosta de viver no limite e utiliza a versão de desenvolvimento do Rails em seus projetos, então já pode começar a utilizar este novo recurso, mesmo que ainda nem tenha o Ruby 1.9 instalado em seu computador. Mas, se você é um pouco mais conservador e não gosta de arriscar (o que pode evitar alguns problemas com bugs), você tem duas opções: esperar pelo Rails 2.3.3 (ou quem sabe o 3.0, não sei qual será o próximo) ou implantar você mesmo esta funcionalidade no seu projeto Rails atual.
Se você optou pela segunda opção, basta criar um arquivo qualquer no diretório lib do seu projeto e incluir o seguinte código nele:
if RUBY_VERSION < '1.9'
=begin
string.rb - Extension for String.
Copyright (C) 2005-2009 Masao Mutoh
You may redistribute it and/or modify it under the same
license terms as Ruby.
=end
# This feature is included in Ruby 1.9 or later but not occur TypeError.
#
# String#% method which accepts named arguments. Particularly useful if the
# string is to be used by a translator because named arguments mean more
# than %s/%d style.
unless instance_methods.find {|m| m.to_s == 'bytesize'}
# For older ruby (such as ruby-1.8.5)
alias :bytesize :size
end
alias :_old_format_m :% # :nodoc:
PERCENT_MATCH_RE = Regexp.union(
/%%/,
/%\{(\w+)\}/,
/%<(\w+)>(.*?\d*\.?\d*[bBdiouxXeEfgGcps])/
)
# call-seq:
# %(arg)
# %(hash)
#
# Format - Uses str as a format specification, and returns the result of applying it to arg.
# If the format specification contains more than one substitution, then arg must be
# an Array containing the values to be substituted. See Kernel::sprintf for details of the
# format string. This is the default behavior of the String class.
# * arg: an Array or other class except Hash.
# * Returns: formatted String
# Example:
# "%s, %s" % ["Masao", "Mutoh"]
#
# Also you can use a Hash as the "named argument". This is recommended way so translators
# can understand the meanings of the msgids easily.
# * hash: {:key1 => value1, :key2 => value2, ... }
# * Returns: formatted String
# Example:
# For strings.
# "%{firstname}, %{familyname}" % {:firstname => "Masao", :familyname => "Mutoh"}
#
# With field type to specify format such as d(decimal), f(float),...
# "%<age>d, %<weight>.1f" % {:age => 10, :weight => 43.4}
if args.kind_of?(Hash)
ret = dup
ret.gsub!(PERCENT_MATCH_RE) {|match|
if match == '%%'
'%'
elsif $1
key = $1.to_sym
args.has_key?(key) ? args[key] : match
elsif $2
key = $2.to_sym
args.has_key?(key) ? sprintf("%", args[key]) : match
end
}
ret
else
ret = gsub(/%([{<])/, '%%\1')
begin
ret._old_format_m(args)
rescue ArgumentError => e
if $DEBUG
$stderr.puts " The string:"
$stderr.puts " args:"
puts e.backtrace
else
raise ArgumentError, e.message
end
end
end
end
end
end
Não esqueça de carregar o arquivo utilizando o método require antes de utiliza-lo. É recomendado que você faça isto em algum arquivo do diretório initializers (talvez seja bom criar um arquivo apenas para esta finalidade). Também recomendo estudar o código acima para entender o que está acontecendo antes de simplesmente sair usando.
Ah, e você também pode definir tipos numéricos assim:
"%<age>d, %<weight>.1f" % {:age => 10, :weight => 43.4}
# => "10, 43.4"
Para mais informações sobre as novidades do Rails, siga-me no Twitter: @carlosbrando.
Eu gosto da forma simples como os desenvolvedores do Ruby on Rails, principalmente David (dhh) resolvem as coisas que lhes incomodam. Desde a primeira versão do Rails se tornou algo comum incluir algumas linhas nas migrations para inserir alguns registros iniciais no banco de dados do projeto.
Alguns desenvolvedores até chegaram a criar projetos na tentativa de “melhorar” a forma de se fazer isso. Eu mesmo já andei usando alguns.
O que David fez, foi simplesmente adicionar um novo arquivo db/seeds.rb nos novos projetos Rails para que possamos incluir este tipo de código. Simples assim.
Depois, no momento de carregar estes registros no seu banco de dados, basta executar o seguinte comando no terminal:
O comando já existente rake db:setup também foi alterado para incluir esta funcionalidade.
A próxima versão do Rails contará com um novo método chamado touch em todos os objetos do ActiveRecord, o método basicamente serve para atualizar os campos updated_at e updated_on do registro atual com a data e hora corrente. Veja abaixo a implementação do método:
current_time = current_time_from_proper_timezone
if attribute
write_attribute(attribute, current_time)
else
write_attribute('updated_at', current_time) if respond_to?(:updated_at)
write_attribute('updated_on', current_time) if respond_to?(:updated_on)
end
save!
end
Como você pode ver na implementação acima ele aceita um parâmetro attribute. Utilizaremos este parâmetro para informar um campo diferente dos mencionados acima quando for necessário.
product.touch # atualiza o campo updated_at
product.touch(:designed_at) # atualiza o campo designed_at
Esta atualização vale tanto para o Rails 3 como para uma futura provável versão do Rails 2.3.
Graças a este novo método também ganhamos um novo atributo para associações belongs_to, fazendo com que ao criar, atualizar ou apagar um registro filho o método touch do registro pai seja executado. Por exemplo, veja o código abaixo:
end
A partir do exemplo, quando cadastrarmos ou atualizarmos um animalzinho de estimação (pet), os campos updated_at/on do dono (owner) correspondente serão automaticamente atualizado com a data atual.
Faz tempo que não escrevo sobre as novidades para a próxima versão do Rails, mas esta em particular me chamou a atenção. No Rails 3.0 não teremos mais a validação de tokens em requisições AJAX.
Este tipo de validação por tokens é essencial para evitar ataques do tipo CSRF. Ao montar um formulário HTML, automaticamente o Rails adiciona um token (um código com letras e números baseado no id da sessão atual) ao formulário, quando o mesmo é enviado de volta ao servidor é possível então verificar se aquele formulário está vindo de uma sessão valida ou se está vindo de algum outro site malicioso.
Até então, este token por padrão também era adicionado automaticamente às chamadas AJAX através dos helpers do Rails. Mas ao criar os seus próprios códigos AJAX Javascript, era necessário que você manualmente incluísse este token para que sua requisição não fosse recusada pelo servidor.
Mas requisições AJAX maliciosas não podem produzir ataques do tipo CSRF, então todo este trabalho manual era desnecessário, e por isto será retirado do Rails na próxima versão. Particularmente eu gostei disso.