Posts Tagged ‘gem’

Acesse a API do Yahoo! Meme com Ruby

May 1st, 2010

A API do Meme pode user acessada utilizando o YQL (Yahoo Query Language) que
permite usar uma sintaxe similar ao SQL para recuperar os dados do Meme, um exemplo seria:

SELECT * FROM meme.info WHERE name='jtadeulopes';

Clique aqui e veja o resultado dentro do console.

Diante disso, durante o Yahoo! Open Hack Day Brasil 2010 resolvi escrever uma gem para acessar a API do Meme utilizando Ruby.

O desenvolvimento ainda esta no início, mas já é possível realizar as seguintes ações:

  • Buscar um usuário
  • Followers e Following
  • Buscar posts
  • Busca os posts mais populares do momento

Instalando

A instalação é bem simples, basta executar o comando

sudo gem install meme

Usando

Localizando um usuário

É possível localizar um usuário e suas informações desta maneira

user = Meme::Info.find('jtadeulopes')

user.name
=> "jtadeulopes"

user.description
=> "software developer"

# outros métodos disponíveis:

user.avatar_url  # URL do avatar.
user.title       # Breve descrição do meme do usuário.
user.guid        # O GUID do usuário.
user.language    # Idioma selecionado pelo usuario no Meme.
user.url         # URL do Meme do usuário.
user.followers   # Seguidores do usuário.
user.following   # Quem o usuário segue.

Buscando posts

posts = Meme::Post.find('brhackday')

post = posts.first

post.content
=> "RT @codepo8: And I am off - plane leaves BR for London. Thanks to everybody I met at #brhackday..."

# Cada post possui os métodos:

post.category       # Categoria do post.
post.timestamp      # Data de publicação.
post.guid           # GUID do usuário.
post.pubid          # ID de publicação do post.
post.url	    # URL do post.
post.repost_count   # Número de vezes que este post foi anunciado.
post.caption        # Legenda do post.
post.type	    # Tipo de mídia. Valores válidos são "text", "photo", "video" ou "audio".
post.content        # Conteúdo publicado.
 

Você pode especificar o tipo de mídia que deseja localizar, as opções são: photo, video, audio ou text.

Por padrão, o tipo text é assumido caso nenhum seja especificado.

posts = Meme::Post.find('meme rocks', :type => :photo)

Populares

Retorna os 10 posts mais populares. Você pode definir o local que deseja pesquisar. Os valores suportados são “en” para Inglês, “es” para o espanhol, “pt” para Português e “id” para Bahasa Indonésia.

Por padrão, o valor pt é assumido caso nenhum seja especificado

popular = Meme::Post.popular

popular.first.caption
=> "Haha duvido que não vai repostar esse sorriso mais lindo ...."

popular = Meme::Post.popular('id')

popular.first.caption
=> "Kemarin dia menawarkan cinta, hmm sayang harganya terlalu mahal jadi aku putuskan untuk tak memilikinya..."
 

Quer contribuir?

O projeto é open source e seu código fonte este no Github. Existe um TODO list para um controle do que foi feito e o que ainda precisa ser implementado.

Qualquer dúvida, deixe um comentário!

Formulários com Formtastic

September 7th, 2009

Procurando uma alternativa para trabalhar com formulários no Rails, encontrei a gem Formtastic.

O projeto é mantido por Justin French e José Valim, além de outras pessoas que ajudaram no projeto. Todo o código fonte esta no Github.

Sem mais, vamos trabalhar =)

Preparando o ambiente

Para gerar os scaffolds e um layout básico vou usar a gem Nifty Generators do Ryan Bates.

Instalando a gem nifty-generators:

sudo gem install nifty-generators

Criado a aplicação:

Pensando em acelerar um pouco o processo, criei um template básico e vamos criar a aplicação usando ele!

rails formtastic -m http://gist.github.com/181560.txt
cd formtastic

Instalando a gem formtastic:

sudo gem install justinfrench-formtastic

Adicione no environment.rb:

# config/environment.rb
config.gem "justinfrench-formtastic", :version => "0.2.2", :lib => 'formtastic', :source  => 'http://gems.github.com'

Gerando um layout basicão:

script/generate nifty_layout

Pronto :)

Usando

Como minha criatividade não permite algo diferente, vamos trabalhar com Produtos e Categorias.

Gerando o scaffold para Categorias:

script/generate nifty_scaffold Category name:string status:boolean ! show

Rode as migrações:

rake db:migrate

Se olharmos o código do formulário criado, teremos algo como:

# app/views/categories/_form.html.erb
 
<% form_for @category do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :status %><br />
    <%= f.check_box :status %>
  </p>
  <p><%= f.submit "Submit" %></p>
<% end %>

Visualizando o formulário:

tela02

Ok Jésus! Você falou, falou, mas cade o Formtastic?

Até agora não fizemos nada com ele. Experimente trocar o código gerado pelo scaffold pelo código abaixo:

# app/views/categories/_form.html.erb
 
<% semantic_form_for @category do |form| %>
  <%= form.inputs %>
  <%= form.buttons %>
<% end %>

Somente isso? Vamos ver o formulário:

tela03

Mas tudo esta muito estranho. Quero modificar e adicionar algumas informações como:

  • Separar em fieldsets diferentes os campos e botões
  • Colocar uma mensagem informativa abaixo do campo Name
  • Alterar o campo Status de checkbox para radio button.
# app/views/categories/_form.html.erb
 
<% semantic_form_for @category do |form| %>
 
  <% form.inputs do %>
    <%= form.input :name, :hint => "Example: food, books, electronics." %>
    <%= form.input :status, :as => :radio %>
  <% end %>
 
  <% form.inputs do %>
    <%= form.commit_button %>
  <% end %>
 
<% end %>

Podemos ter o controle de tudo! Veja como ficou:

tela04

Vamos para o cadastro de Produtos, gerando o scaffold para o mesmo:

script/generate nifty_scaffold Product category_id:integer name:string description:text price:decimal status:boolean
rake db:migrate

Criando o relacionamento entre Produtos e Categorias:

# app/models/category.rb
class Category < ActiveRecord::Base
 
  has_many :products
 
  validates_presence_of :name
  validates_inclusion_of :status, :in => [true, false]
 
end
 
# app/models/product.rb
class Product < ActiveRecord::Base
 
  belongs_to :category
 
  validates_presence_of :category, :name, :price
  validates_inclusion_of :status, :in => [true, false]
 
end

Nosso formulário está assim:

tela05

Não esta legal, vamos melhorar para:

  • Adicionar um select para escolher uma categoria.
  • Deixar o (*) somente nos campos obrigatórios.
  • Diminuir o tamanho do campo Price.
  • Alterar o campo Status de checkbox para select.
# app/views/products/_form.html.erb
 
<% semantic_form_for @product do |form| %>
 
  <% form.inputs do %>
    <%= form.input :category %>
    <%= form.input :name %>
    <%= form.input :description, :required => false, :input_html => {:rows => 3} %>
    <%= form.input :price, :input_html => {:size => 10} %>
    <%= form.input :status, :as => :select %>
  <% end -%>
 
  <% form.inputs do %>
    <%= form.commit_button %>
  <% end -%>
 
<% end -%>

Olha ai como ele ficou:

tela06

Input Types

Formtastic mapeia diretamente a maioria dos inputs, mas se por algum motivo você precisar alterar o seu tipo (por exemplo, como fizemos com o Status) você pode usar:

  • :select (select para associações)
  • :check_boxes (conjunto de check_box) – uma alternativa ao :select para associações has_many e has_and_belongs_to_many
  • :radio (conjunto de radio) – alternativa ao :select para associações belongs_to
  • :time_zone (select com fusos horários)
  • :password (campo tipo password) – padrão para colunas do tipo :string com ‘password’ no nome do método
  • :text (textarea) – padrão para colunas do tipo :text
  • :date (select para datas) – padrão para colunas do tipo :date
  • :datetime (select para data e hora) – padrão para colunas do tipo :datetime e :timestamp
  • :time (select para hora) – padrão para colunas do tipo :time
  • :boolean (checkbox) – padrão para colunas do tipo :boolean (você também pode usar :select e :radio)
  • :string (campo de texto) – padrão para colunas do tipo :string
  • :numeric (campo de texto, como string) – padrão para colunas do tipo :integer, :float e :decimal
  • :country (menu select com nomes de países) – requer plugin country_select instalado
  • :hidden (campo oculto) – cria um campo oculto

Stylesheets

Mas Jésus, e esse visual feio ai? Tem como melhorar não??

Claro que tem! Tente isso:

script/generate formtastic_stylesheets

Ele vai copiar dois arquivos (formtastic.css e formtastic_changes.css) dentro da pasta public/stylesheets para que você possa personalizar todo o visual do formulário :)

Basta adicionar ambos na view e trabalhar em suas propriedades:

<%= stylesheet_link_tag "formtastic" %>
<%= stylesheet_link_tag "formtastic_changes" %>

Claro que muito mais pode ser feito, como suporte a I18n, upload de imagens, mas isso ficará para um outro post =/

Vale a pena dar uma olhada em sua ótima documentação e nos seus arquivos no Github.

A idéia aqui, foi dar uma introdução e mostrar como ele pode facilitar e ajudar na hora de trabalhar com formulário no Rails.

É isso ai, vou finalizando por aqui :)

Populando banco de dados usando a gem Populator

June 13th, 2009

É preciso demonstrar uma funcionalidade da aplicação para o cliente, mas para isso é necessário realizar diversos cadastros e gerar informações na base de dados. Dependendo da quantidade de registros, fazer isso manualmente acaba ficando muito chato além de consumir um longo tempo.

Procurando uma maneira de automatizar esse processo, encontrei a gem Populator que facilita e muito esse trabalho.

Como Usar:

Primeiro instale a gem

sudo gem install populator

Após instalar, no console já podemos fazer algo como:

>> require 'populator'
=> []
>> Category.count
=> 0
>> Category.populate(10) { |category| category.name = Populator.words(1..3).titleize }
=> {}
>> Category.count
=> 10
>> Category.first
=> #<Category id: 1, name: "Fuga Debitis Temporibus", created_at: "2009-06-13 14:17:24", updated_at: "2009-06-13 14:17:24">
>>

Existem alguns metodos que podemos usar para gerar alguns dados como:

Populator.words(5) # gera 5 palavras aleatoriamente e insere um espaço entre elas
Populator.words(1..3) # gera entre uma e três palavras aleatoriamente
Populator.sentences(3) # gera 3 frases
Populator.paragraphs(2) # gera 2 paragrafos

Mas dependendo to tamanho de nosso model, ficar digitando tudo isso pelo console acaba dando muito trabalho também. Vamos melhorar isso!

Crie um novo arquivo em lib/tasks/populate.rake e crie a seguinte tarefa:

namespace :db do
  desc "Popula base de dados"
  task :populate => :environment do
 
    require 'populator'
 
    Category.populate 30 do |category|
      category.name = Populator.words(1..3).titleize
    end
 
  end
end

Agora dentro do diretório da aplicação, basta rodar a tarefa:

 rake db:populate 

Bem melhor :)

Podemos melhorar ainda mais este processo e deixar ele mais completo utilizando a gem Faker que gera dados como nome, telefone, endereço, e-mail e pode ser usada junto com a Populator.

Vale a pena assistir a este Railscast onde é demonstrado como utilizar as duas gems.

É isso ai! :D

AnnotateModels

June 12th, 2009

Precisa saber de forma rápida quais atributos um determinado model tem?

A gem AnnotateModels facilita este trabalho, adicionando em forma de comentários dentro do model, todos os seus atributos.

Como usar:

Primeiro instale a gem. No terminal digite:

sudo gem install annotate

Em seguida, acesse o diretório da aplicação e execute:

annotate

Veja como ficou nosso model:

# == Schema Information
#
# Table name: categories
#
# id :integer(4) not null, primary key
# name :string(255)
# description :text
# created_at :datetime
# updated_at :datetime
#
 
class Category < ActiveRecord::Base
  validates_presence_of :name
  validates_presence_of :description
end

Simples e bastante útil.