Arquivo

Textos com Etiquetas ‘Rails’

Returning em Ruby on Rails

5, agosto, 2010

Quantas vezes você já criou algum método em Ruby que inicializa uma variável, atribui valores a ela e depois a retorna?

Veja o exemplo abaixo:

def some_values
  values = []
  values << "first element"
  values << "second element"
  values
end

some_values # => ["first element", "second element"]

A linha 2 é cria um array vazio, depois são atribuidos valores nas linhas 3 e 4, e finalmente na linha 5 o array é retornado pelo método.

Em Ruby on Rails existe o método returning da classe Object que facilita nossa vida nesses casos:

def some_values
  returning values = [] do
    values << "first element"
    values << "second element"
  end
end

some_values # => ["first element", "second element"]

Na linha 2 chamamos o método returning passando a variável que será retornada já atribuindo seu valor inicial. Dentro do bloco, nas linhas 3 e 4, então atribuímos os valores ao array.

Há também esse outro tipo de sintaxe:

def some_values
  returning [] do |values|
    values << "first element"
    values << "second element"
  end
end

some_values # => ["first element", "second element"]

Funciona da mesma forma, mas acaba sendo não tão intuitivo como o código anterior.

Veja um trecho de código utilizando o método returning, de um método auxiliar para testes de RSpec retirado de uma aplicação real:

def variants
  returning variants = [] do
    5.times do |priority| do
      variants << Factory.build(:variant, :priority => priority)
    end
  end
end

E olhe só como é simples a implementação do método returning:

def returning(value)
  yield(value)
  value
end

Ruby , , ,

[fisl11] O que rolou de Ruby e Ruby on Rails

27, julho, 2010

Como nas edições anteriores, esse ano no fisl11 tivemos várias palestras relacionadas com Ruby e Rails.

Quarta, 21 de julho

No primeiro dia, mostrei o uso do Spree, uma plataforma completa de comércio eletrônico desenvolvida em Ruby on Rails, como base de um novo sistema de loja virtual da Locaweb.

Nessa apresentação foram mostradas algumas técnicas de metaprogramação Ruby para lidar com as extensões do Spree e organizar melhor seu código.

Os slides da palestra “Locaweb + Spree: transformando código aberto em um projeto comercial” estão disponíveis nesse link:
http://www.slideshare.net/Prodis/locaweb-spree-transformando-cdigo-aberto-em-um-projeto-comercial

Quinta, 22 de julho

Neste dia, Daniel Lopes iniciou o “Mini-curso de Ruby e Rails”, introduzindo a linguagem de programação Ruby e os primeiros passos de Ruby on Rails. Essa primeira parte do curso teve duas horas de duração com a sala lotada.

Sexta, 23 de julho

“Lapidando Ruby” foi uma palestra muito interessante de Mauricio Szabo. Foram apresentadas algumas práticas para deixar seu código Ruby mais limpo, e outras técnicas para que seus testes fiquem mais claros e compreensíveis.

Os slides dessa palestra estão disponíveis nesse link:
http://www.slideshare.net/mauricioszabo/lapidando-ruby

A exemplo do dia anterior, a segunda parte do “Mini-curso de Ruby e Rails”, de Daniel Lopes, também teve sua sala lotada. O foco foi em montar uma aplicação simples em Ruby on Rails.

Sábado, 24 de julho

No último dia do fisl11, tivemos praticamente uma Maratona Ruby on Rails.

Para começar, Fabio Akita apresentou em duas horas “Ecossistema Ruby on Rails”, falando sobre o que se formou em volta do Ruby on Rails, como soluções completas em diversas áreas como deployment, e filosofias de empreendedorismo e desenvolvimento ágil.

Os slides dessa palestra estão disponíveis nesse link:
http://www.slideshare.net/akitaonrails/fisl-11-ecossistema-ruby-on-rails

Logo em seguida, tivemos mais uma apresentação do Fabio Akita, dessa vez sobre “Dicas de Desenvolvimento Web com Ruby”, onde foram mostradas algumas soluções simples para resolver o problema de lentidão de aplicações Web, por conta do entendimento pobre da arquitetura Web e suas alternativas.

Os slides dessa palestra estão disponíveis nesse link:
http://www.slideshare.net/akitaonrails/fisl-11-dicas-de-desenvolvimento-web-com-ruby

E o vídeo usado na apresentação está em:
http://dl.dropbox.com/u/1732133/dicas-de-desenvolvimento-web-com-rails.zip

E para finalizar a maratona, Daniel Lopes deu a terceira e última parte do “Mini-curso de Ruby e Rails”, finalizando a aplicação Ruby on Rails iniciada no segundo dia do treinamento e mostrando várias dicas interessantes sobre Rails.

Os slides de todo mini-curso estão disponíveis nesse link:
http://www.slideshare.net/danielvlopes/minicurso-ruby-e-rails

E o código fonte está em:
http://github.com/danielvlopes/fisl

.
Além disso, a galera do #HoraExtra esteve presente programando e publicando aplicações pequenas, desenvolvidas em Ruby on Rails, durante todo o fisl11. Mais detalhes do como isso aconteceu, você pode ver aqui.

Um abraço a todos os Railers que estiveram presentes ou que acompanharam virtualmente mais esse grande evento.

Eventos, Ruby , , , , , , , , ,

[fisl11] Sala de recepção dos palestrantes

25, julho, 2010

O site do fisl11 trouxe várias notícias durante o evento.

Estava dando uma olhada nessas notícias e encontrei uma foto minha na sala de recepção dos palestrantes, onde conversei com um rapaz que trabalhava na comunicação do evento sobre minha apresentação.

Foto retirada do site do fisl11

Foto retirada do site do fisl11

Veja um trecho da notícia:

…Fernando Hamasaki de Amorim, da Locaweb, já está com sua palestra pronta e aguardando. “Transformando código aberto em um projeto comercial” às 20h na sala 41E de hoje.

Fernando pretende apresentar um estudo de caso onde ele irá relatar os desafios e dificuldades, vantagens e desvantagens em utilizar código aberto para criar um novo sistema. “Vou falar também de códigos aberto em detalhes e mostrar como se ganha dinheiro com software livre. O código é aberto, mas alguém ganha com isto”, explicou. Mais detalhes vale a pena conferir a palestra de Fernando.

.
Para ver a notícia completa, acesse o link abaixo:
http://softwarelivre.org/fisl11/noticias/sala-de-recepcao-dos-palestrantes-esta-lotada

Eventos , , , , , , , , ,

[fisl11] Slides da apresentação Locaweb + Spree: transformando código aberto em um projeto comercial

22, julho, 2010

Veja os slides da palestra “Locaweb + Spree: transformando código aberto em um projeto comercial” que foi apresentada em 21/07/2010 no fisl11.

Agradeço a todos que estiveram presentes.

Eventos , , , , , , , , ,

[fisl11] Confirmadas data e hora da palestra Locaweb + Spree

12, julho, 2010

Está confirmada data, hora e sala da minha palestra “Locaweb + Spree: transformando código aberto em um projeto comercial” no fisl11.

A apresentação será no dia 21/07 às 20h na sala 41-E fisl 5.

Veja também:

Eventos , , , , , , , , ,

[fisl11] Minha proposta de palestra foi aceita

21, junho, 2010

Nos dias 21 a 24 de julho, será realizado em Porto Alegre o fisl11, o 11º Fórum Internacional de Software Livre.

O FISL é o maior evento de software livre da América Latina e a edição do ano passado atingiu a marca de 8.244 participantes.

Entre os assuntos que serão abordados, estão:

  • Linux, Ubuntu, KDE, BSD
  • Desenvolvimento em Ruby, Java, PHP, Python, Perl e Smalltalk
  • Desenvolvimento de Jogos, Multimídia e Streaming
  • Gerenciamento de Dados (SGBD, Storage, backup…)
  • Hardware, Sistemas Embarcados e Robótica
  • Segurança
  • Software livre e negócios
  • Educação e Inclusão Digital

Minha proposta de palestra “Locaweb + Spree: transformando código aberto em um projeto comercial” para o fisl11 foi aceita.

Segue o resumo da palestra:

Os desafios, benefícios, dificuldades e lições aprendidas que a equipe de desenvolvimento de SaaS da Locaweb teve na utilização do Spree, uma plataforma de comércio eletrônico de código aberto, como base de seu novo sistema de loja virtual multi-usuário, desenvolvido em Ruby on Rails. O poder e o dinamismo do Ruby tiveram destaque, com grande utilização de metaprogramação nas extensões do Spree.

Eventos , , , , , , , , ,

Screencasts sobre Ruby on Rails 3

14, junho, 2010

Em um keynote da RailsConf 2010, Gregg Pollack divulgou uma série de screencasts sobre Ruby on Rails 3.

Dive into Rails 3
http://rubyonrails.org/screencasts/rails3

Esses screencasts foram feitos por ele em parceria com a EnvyLabs.

Veja também esses slides da RailsConf 2010:

Keynote do Gregg Pollack
http://s3.amazonaws.com/dhhmix/rails3-railsconf2010.pdf

Tutorial “The Rails 3 Ropes Course”
http://assets.en.oreilly.com/1/event/40/The%20Rails%203%20Ropes%20Course%20Presentation.pdf

Na RailsConf 2010 foi anunciado o Rails 3 beta 4 e que a versão release candidate seria lançada até o final do evento. Ainda não foi lançado, mas deve estar disponível nos próximos dias.

Eventos, Ruby , , , , ,

Material de estudo sobre Ruby on Rails 3

14, junho, 2010

Para acompanhar melhor os tutorias e apresentações relacionadas ao Ruby on Rails 3 que rolaram na RailsConf 2010, separei uma série de artigos/posts e fui lendo na viagem de ida.

Seguem os links:

Ruby on Rails 3.0 Release Notes
http://guides.rails.info/3_0_release_notes.html

Rails Edge Architecture
http://yehudakatz.com/2009/06/11/rails-edge-architecture

Rails 3: The Great Decoupling
http://yehudakatz.com/2009/07/19/rails-3-the-great-decoupling

ActiveModel: Make Any Ruby Object Feel Like ActiveRecord
http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord

Sexy Validation in Edge Rails (Rails 3)
http://thelucid.com/2010/01/08/sexy-validation-in-edge-rails-rails-3

validates :rails_3, :awesome => true
http://lindsaar.net/2010/1/31/validates_rails_3_awesome_is_true

Active Record Query Interface 3.0
http://m.onkey.org/2010/1/22/active-record-query-interface

Why Arel?
http://magicscalingsprinkles.wordpress.com/2010/01/28/why-i-wrote-arel

Active Record Query Interface
http://guides.rails.info/active_record_querying.html

The Rails Module (in Rails 3)
http://litanyagainstfear.com/blog/2010/02/03/the-rails-module

The Lowdown on Routes in Rails 3
http://www.engineyard.com/blog/2010/the-lowdown-on-routes-in-rails-3

Rails 3 I18n changes
http://blog.plataformatec.com.br/2010/02/rails-3-i18n-changes

Rails 3: Introdução a Javascript Não-Obstrutivo e Responders
http://www.akitaonrails.com/2010/05/10/rails-3-introducao-a-javascript-nao-obstrusivo-e-responders

Rails 3: Introdução a Engines
http://www.akitaonrails.com/2010/05/10/rails-3-introducao-a-engines

Customizing Rails Apps with Plugins
http://www.railsdispatch.com/posts/building-or-updating-a-rails-3-plugin

Upgrading a Rails 2 App to Rails 3
http://www.railsdispatch.com/posts/upgrading-a-rails-2-app-to-rails-3

Getting Rails 3 Edge with jQuery, RSpec and Cucumber using RVM
http://lindsaar.net/2010/5/9/Getting-Rails-3-Edge-with-jQuery-RSpec-and-Cucumber-using-RVM

Rails 3.0 Beta – 36 Links e artigos para você começar
http://www.rubyinside.com.br/rails-30-beta-36-links-e-artigos-para-voce-comecar-2947

Ruby , , , , , , ,

“Pretty print” para seus objetos Ruby

8, abril, 2010

Vira e mexe, seja no irb ou no script/console, temos que exibir o conteúdo de objetos para examinar seus valores. A maneira mais comum para fazer isso é utilizando os método puts ou o método p, como no exemplo abaixo:

Esse tipo de exibição não é muito legível, principalmente se você estiver no script/console visualizando os dados de  um ActiveRecord:

No caso de objetos ActiveRecord, há a opção da exibição em YAML, chamando o método y no script/console:

Agora existe uma gem chamada awesome_print que permite exibir os dados dos objetos com identação e cores de acordo com o tipo de dado.

Primeiro vamos instalá-la:
$ sudo gem install awesome_print

E para exemplificar, vamos usar o script/console para exibir os valores de um hash. Note que é necessário fazer uma referência para o arquivo “ap”. Depois bastar chamar o método ap:

Uma coisa legal é que dependendo do tipo do valor, as cores são diferentes.

Agora veja um exemplo utilizando um ActiveRecord:

Uma ressalva negativa é a não exibição dos valores decimais, como acontece quando se exibe o ActiveRecord em YAML. Talvez para uma próxima versão isso melhore.

Há também algumas opções para customizar a forma como os dados são exibidos pela awesome_print, como por exemplo o tamanho da identação e as cores. Para mais informações, veja a documentação da gem: http://github.com/michaeldv/awesome_print.

Ruby , , , , , ,

Utilizando debug em aplicações Rails

20, março, 2010

Muita gente acha (assim como eu achava há um tempo atrás) que não é possível utilizar debug (ou “depurar”, ou “debugar”) uma aplicação Ruby on Rails. Acredito que isso se deve ao fato de Ruby ser uma linguagem interpretada, diferente de outras linguagens que requerem compilação.

Existe uma forma muito simples de se “debugar” em Rails. Primeiro vamos instalar a gem ruby-debug.
$ sudo gem install ruby-debug

Agora vamos criar uma aplicação Rails de exemplo para utilizar o debug.
$ rails prodis-debug
$ cd prodis-debug
$ rails script/generate scaffold MyModel my_text:string my_value:float
$ rake db:migrate

E ao invés de subir a aplicação com script/server, iniciamos a aplicação em modo debug:
$ rdebug script/server
/Users/Prodis/Blog/code/prodis-debug/script/server:2
require File.expand_path(’../../config/boot’, __FILE__)
(rdb:1)

Esse é o momento de adicionarmos o(s) breakpoint(s) desejados, informando o arquivo e a linha do mesmo. Vamos colocar um breakpoint na ação create de MyModelsController:
(rdb:1) break app/controllers/my_models_controller.rb:43
Breakpoint 1 file /Users/Prodis/Blog/code/prodis-debug/app/controllers/my_models_controller.rb, line 43

E usamos o comando cont para prosseguir com o carregamento da aplicação no servidor.
(rdb:1) cont
=> Booting Mongrel
=> Rails 2.3.5 application starting on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server

No browser, através do endereço http://localhost:3000/my_models/new, vamos criar um novo registro de MyModel.

Quando clicarmos no botão “Create”, a aplicação irá parar no breakpoint que colocamos na linha 43 de MyModelsController.
Breakpoint 1 at /Users/Prodis/Blog/code/prodis-debug/app/controllers/my_models_controller.rb:43
/Users/Prodis/Blog/code/prodis-debug/app/controllers/my_models_controller.rb:43
@my_model = MyModel.new(params[:my_model])
(rdb:6)

A partir daqui podemos investigar o código e ter acesso as suas variáveis. Por exemplo, exibindo os valores da variável params:
(rdb:6) p params
{”my_model”=>{”my_text”=>”I am some text”, “my_value”=>”50.00″}, “commit”=>”Create”, “authenticity_token”=>”qN9mUhJelZD0V/P2CB1fhBkQrIxFvvk+NRkY5m6EFWg=”, “action”=>”create”, “controller”=>”my_models”}

Mas a maneira mais fácil de inspecionar variáveis é pelo irb, que irá se manter no contexto atual onde a aplicação está parada.
(rdb:6) irb
irb(#):001:0> params
=> {”my_model”=>{”my_text”=>”I am some text”, “my_value”=>”50.00″}, “commit”=>”Create”, “authenticity_token”=>”qN9mUhJelZD0V/P2CB1fhBkQrIxFvvk+NRkY5m6EFWg=”, “action”=>”create”, “controller”=>”my_models”}
irb(#):002:0>

Saindo do irb (com o comando exit), nós voltamos para o ambiente de debug. Há uma série de comandos úteis para se utilizar. Um deles é o list, que exibe o trecho de código onde a aplicação está parada e indicando sua linha exata através de uma seta:
(rdb:6) list
[38, 47] in /Users/Prodis/Blog/code/prodis-debug/app/controllers/my_models_controller.rb
38 end
39
40 # POST /my_models
41 # POST /my_models.xml
42 def create
=> 43 @my_model = MyModel.new(params[:my_model])
44
45 respond_to do |format|
46 if @my_model.save
47 flash[:notice] = ‘MyModel was successfully created.’
(rdb:6)

Para avançar até a próxima linha, usamos o comando next:
(rdb:6) next
/Users/Prodis/Blog/code/prodis-debug/app/controllers/my_models_controller.rb:45
respond_to do |format|
(rdb:6)

Para listar todos os comandos disponíveis, basta entrarmos no help:
(rdb:6) help
ruby-debug help v0.10.3
Type ‘help ‘ for help on a specific command

Available commands:
backtrace delete enable help next quit show trace
break disable eval info p reload source undisplay
catch display exit irb pp restart step up
condition down finish list ps save thread var
continue edit frame method putl set tmate where

(rdb:6)

Também podemos visualizar a ajuda de um comando específico:
(rdb:6) help next
n[ext][+-]?[ nnn] step over once or nnn times,
‘+’ forces to move to another line.
‘-’ is the opposite of ‘+’ and disables the force_stepping setting.
(rdb:6)

E para continuar a execução da aplicação, usamos o comando continue (ou um dos seus álias c ou cont)
(rdb:6) continue

Processing MyModelsController#create (for 127.0.0.1 at 2010-03-20 12:20:54) [POST]
Parameters: {”my_model”=>{”my_text”=>”I am some text”, “my_value”=>”50.00″}, “commit”=>”Create”, “authenticity_token”=>”qN9mUhJelZD0V/P2CB1fhBkQrIxFvvk+NRkY5m6EFWg=”}
MyModel Create (0.5ms) INSERT INTO “my_models” (”my_text”, “created_at”, “updated_at”, “my_value”) VALUES(’I am some text’, ‘2010-03-20 15:45:19′, ‘2010-03-20 15:45:19′, 50.0)
Redirected to http://localhost:3000/my_models/4
Completed in 1464995ms (DB: 1) | 302 Found [http://localhost/my_models]

Existe também uma outra maneira de se “debugar” com a gem ruby-debug. Nós podemos colocar uma instrução debugger (que na verdade é um método) em qualquer lugar do código para marcar como breakpoint. O Railscast #54 Debugging with ruby-debug mostra os passos de como fazer isso.

Eu particularmente gosto de configurar os breakpoints direto no Terminal, evitando assim ter que colocar qualquer informação de debug no código.

Esse esquema de debug não se restringe somente à aplicações Rails. Você pode muito bem utilizá-lo com código Ruby diretamente. Por exemplo, o código abaixo é do arquivo some_class.rb:

#lib/some_class.rb
class SomeClass
  def some_method
    # do something here
  end

  def other_method
    # do another thing here
  end
end

É só utilizar o comando rdebug passando o nome do arquivo:
$ rdebug lib/some_class.rb
/Users/Prodis/Blog/code/prodis-debug/lib/some_class.rb:2
class SomeClass
(rdb:1)

Para informações mais detalhadas sobre a gem ruby-debug, veja a documentação completa.

Ruby , , ,