Rails 2.2: Adicionando um prefixo aos delegates

15 de dezembro de 2008  |  Rails 2.2  |  Nenhum comentário  | 

O método Module#delegate agora possui uma nova opção :prefix que pode ser atribuída caso você queira que o nome da classe alvo seja usado como prefixo antes do nome do método. Vejamos dois exemplos, primeiro da forma comum:

class Invoice < ActiveRecord::Base
  delegate :street, :city, :name, :to => :client
end

Invoice.new.street
Invoice.new.city
Invoice.new.name

Agora usando a opção :prefix:

class Invoice < ActiveRecord::Base
  delegate :street, :city, :name, :to => :client, :prefix => true
end

Invoice.new.client_street
Invoice.new.client_city
Invoice.new.client_name

Você também pode personalizar, atribuindo um outro nome ao prefixo:

class Invoice < ActiveRecord::Base
  delegate :street, :city, :name, :to => :client, :prefix => :customer
end

Invoice.new.customer_street
Invoice.new.customer_city
Invoice.new.customer_name

Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades do Rails 2.2 no e-book “Ruby on Rails – O que há de novo?“.

Rails 2.2: Erro ao criar dois controllers com o mesmo nome

11 de dezembro de 2008  |  Rails 2.2  |  4 Comentários  | 

No Rails 2.1 em alguns casos ao se criar dois controllers com o mesmo nome, mas em namespaces diferentes um erro acontece, veja:

$ rails -v
Rails 2.1.0

$ ruby -v
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]

$ rails test

$ cd test/

$ script/generate scaffold Posts title:string body:text

$ script/generate controller -t Admin::Posts
The name 'Admin::PostsHelper' is either already used in your application or reserved by Ruby on Rails.
  Please choose an alternative and run this generator again.
  ...

Mais um bug corrigido na versão 2.2.


Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades do Rails 2.2 no e-book “Ruby on Rails – O que há de novo?“.

Rails 2.2: Time#advance reconhece frações de dias e semanas

10 de dezembro de 2008  |  Rails 2.2  |  Nenhum comentário  | 

Após o lançamento do Rails 2.1 o método Time#advance parou de funcionar corretamente com frações de tempo como:

>> Time.stubs(:now).returns Time.local(2000)

>> 1.5.days.ago == 36.hours.ago
# => false

Este erro foi corrigido no Rails 2.2.


Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades do Rails 2.2 no e-book “Ruby on Rails – O que há de novo?“.

Rails 2.2: Suporte a XHTML no atom_feed

9 de dezembro de 2008  |  Rails 2.2  |  Nenhum comentário  | 

O helper atom_feed agora possui um builder interno que permite a criação de XHTML simplesmente acrescentando :type=>”xhtml” em qualquer elemento content, rights, title, subtitle ou summary. Assim:

entry.summary(:type => 'xhtml') do |xhtml|
  xhtml.p "A XHTML summary"
  xhtml.p post.body
end

Veja como este bloco se encaixa dentro do atom_feed:

atom_feed do |feed|
  feed.title("My great blog!")
  feed.updated((@posts.first.created_at))

  for post in @posts
    feed.entry(post) do |entry|
      entry.title(post.title)

      entry.summary(:type => 'xhtml') do |xhtml|
        xhtml.p "A XHTML summary"
        xhtml.p post.body
      end

      entry.author do |author|
        author.name("DHH")
      end
    end
  end
end

Desta forma o builder interno do atom_feed irá incluir o XHTML gerado dentro de uma tag DIV.

Claro que ainda podemos fazer da forma antiga passando todo o HTML dentro de uma string, mas desta forma nosso código fica mais limpo.


Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades do Rails 2.2 no e-book “Ruby on Rails – O que há de novo?“.

Rails 2.2: Adicionando instruções de processamento em documentos XML

5 de dezembro de 2008  |  Rails 2.2  |  Nenhum comentário  | 

Uma nova opção foi incluída ao método atom_feed, agora podemos incluir instruções de processamento ao xml. Veja um exemplo:

atom_feed(:schema_date => '2008', :instruct => {
  'xml-stylesheet' => {
    :href=> 't.css', :type => 'text/css'
  }
}) do |feed|

  # ...

end

Instruções de processamento são informações contidas no documento XML que serão repassadas para o aplicativo que o requisitou. Essas instruções são na maioria das vezes usadas para informar ao aplicativo como ele deve manipular os dados que estão no documento XML.

No exemplo acima estou dizendo ao aplicativo que recebe o XML que ele deve exibi-lo com uma folha de estilo (CSS) especifico. Veja como fica no XML:

<?xml-stylesheet type="text/css" href="t.css"?>

Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades do Rails 2.2 no e-book “Ruby on Rails – O que há de novo?“.

Rails 2.2: Bug ao testar rotas nomeadas

3 de dezembro de 2008  |  Rails 2.2  |  Nenhum comentário  | 

Existia um bug bem especifico no Rails, que vinha sendo arrastado até a versão 2.1, quando em um teste funcional testávamos o funcionamento de uma rota nomeada usando parâmetros antes de executar um request. Para entender do que estou falando, veja um exemplo:

def test_something
  post_url(:id => 1) # Antes do request isto retornará um erro
  get :edit, :id => 1
  post_url(:id => 1) # Aqui funciona
end

Este problema foi corrigido no Rails 2.2.


Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades do Rails 2.2 no e-book “Ruby on Rails – O que há de novo?“.

Rails 2.2: Limitando as actions de um recurso

28 de novembro de 2008  |  Rails 2.2  |  1 Comentário  | 

A criação de rotas nomeadas é algo muito simples, mas muito poderoso dentro do Rails. Por isto é justo que ele receba uma atenção especial em cada novo release.

No Rails 2.2 o sistema de rotas polimórficas foi aprimorado e o acesso aos resources foi simplificado. E para fechar com chave de ouro, uma nova opção na criação de rotas promete diminuir um pouco os gastos com memória causados pela geração desnecessária de código.

Duas novas opções foram adicionadas ao map.resources: :only e :except.

map.resources :posts

No código acima estou criando sete actions (index, create, new, edit, show, update e destroy) para o recurso Post. Mas digamos que eu só precise de duas (index e show), neste caso estou criando cinco actions desnecessariamente.

Usando estas novas opções eu poderia fazer isto:

map.resources :posts, :only => [:index, :show]

Assim, somente as actions necessárias serão criadas. Veja um outro exemplo de uso:

map.resources :posts, :only => [:index, :show] do |post|
  post.resources :comments, :except => [:update, :destroy]
end

No código acima acrescentei o recurso Comment, mas removendo as actions update e destroy que não serão usadas, já que não será possível atualizar nem apagar os comentários de um post.

Veja um resumo de algumas ações e o retorno de cada uma:

GET /posts (action PostsController#index)
POST /posts (falha)
GET /posts/1 (action PostsController#show)
DELETE /posts/1 (falha)
POST /posts/1/comments (action CommentsController#create)
PUT /posts/1/comments/1 (falha)

Um recurso interessante, mas que deve ser usado com critério.


Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades do Rails 2.2 no e-book “Ruby on Rails – O que há de novo?“.

Rails 2.2: ActiveResource::Base #to_xml e #to_json

25 de novembro de 2008  |  Rails 2.2  |  Nenhum comentário  | 

Mais dois novos métodos foram acrescentados ao ActiveResource::Base: to_xml e to_json. O primeiro converte o recurso em uma string XML e o segundo retorna também uma string, mas no formato JSON representando o modelo.

O método to_json pode ser configurado através de um parâmetro opcional com as opções :only e :except, permitindo restringir ou remover determinados atributos. Por exemplo:

person = Person.new(:first_name => "Carlos", :last_name => "Brando")
person.to_json
# => {"first_name": "Carlos", "last_name": "Brando"}

person.to_json(:only => ["first_name"])
# => {"first_name": "Carlos"}

person.to_json(:except => ["first_name"])
# => {"last_name": "Brando"}

Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades do Rails 2.2 no e-book “Ruby on Rails – O que há de novo?“.

Rails 2.2 – Finalmente

23 de novembro de 2008  |  Notícias, Open Source, Rails 2.2  |  1 Comentário  | 

Finalmente a versão final do Rails 2.2 saiu!

Acho que já cobrimos todas as novidades desta nova versão, e de várias formas possíveis. Para ficar sabendo de tudo que temos de novo você tem três formas:

Série Edge Rails (Rails 2.2): clique aqui.

Rails Podcast Especial Rails 2.2: clique aqui.

Livro “Ruby on Rails 2.2 – O que há de novo?”: clique aqui.


Para atualizar, primeiro você precisa ter a versão 1.3.1 do RubyGems:

gem update --system

Então instale a última versão do Rails:

gem install rails

Rails 2.2: Suporte à banco de dados IBM DB no gerador do Rails

20 de novembro de 2008  |  Rails 2.2  |  Nenhum comentário  | 

Foi adicionado ao generator do Rails a opção IBM DB para o banco de dados. Para usá-la basta executar no terminal o seguinte comando ao criar o projeto Rails:

rails app_name -d ibm_db

Isto criará seu projeto com o seguinte arquivo database.yml:

# IBM Dataservers
#
# Home Page
# http://rubyforge.org/projects/rubyibm/
#
# To install the ibm_db gem:
# On Linux:
# Source the db2profile file and set the necessary environment variables:
#
# . /home/db2inst1/sqllib/db2profile
# export IBM_DB_DIR=/opt/ibm/db2/V9.1
# export IBM_DB_LIB=/opt/ibm/db2/V9.1/lib32
#
# Then issue the command: gem install ibm_db
#
# On Windows:
# Issue the command: gem install ibm_db
# If prompted, select the mswin32 option
#
# For more details on the installation refer to http://rubyforge.org/docman/view.php/2361/7682/IBM_DB_GEM.pdf
#
# For more details on the connection parameters below refer to:
# http://rubyibm.rubyforge.org/docs/adapter/0.9.0/rdoc/classes/ActiveRecord/ConnectionAdapters/IBM_DBAdapter.html

development:
  adapter: ibm_db
  username: db2inst1
  password:
  database: app_name_dev
  #schema: db2inst1
  #host: localhost
  #port: 50000
  #account: my_account
  #app_user: my_app_user
  #application: my_application
  #workstation: my_workstation

test:
  adapter: ibm_db
  username: db2inst1
  password:
  database: app_name_tst
  #schema: db2inst1
  #host: localhost
  #port: 50000
  #account: my_account
  #app_user: my_app_user
  #application: my_application
  #workstation: my_workstation

production:
  adapter: ibm_db
  username: db2inst1
  password:
  database: app_name_prd
  #schema: db2inst1
  #host: localhost
  #port: 50000
  #account: my_account
  #app_user: my_app_user
  #application: my_application
  #workstation: my_workstation

Todos os exemplos dados aqui funcionarão somente no Ruby on Rails 2.2 ou superior. Você pode encontrar mais detalhes sobre esta e outras novidades do Rails 2.2 no e-book “Ruby on Rails – O que há de novo?“.