Carlos Brando

Nome do Jogo

Por que Paperclip?

No último podcast mencionei minha escolha pelo Paperclip como meu plugin preferido para upload de arquivos. Depois disso algumas pessoas tem me perguntado porque usá-lo, já que o attachment_fu seria a opção mais conhecida.

Durante muito tempo usei o attachment_fu para esta função, mas em um projeto recente da Surgeworks optei por testar o Paperclip e depois disso acabei adotando-o como meu plugin padrão para uploads. Confesso que de inicio o grande motivo para experimentar o novo plugin foi por ele ter sido criado pela thoughtbot, o mesmo time que criou o Shoulda (que não estou usando mais, mas é uma outra história que vou explicar em um outro post), e como os caras são bons e tem criado inúmeros projetos interessantes, resolvi dar uma chance.

Mas foram alguns detalhes que me chamaram a atenção, como o fato de você não precisar de uma tabela extra no banco de dados para armazenar o caminho dos arquivos, a forma simplificada que ele oferece para se acessar e configurar o tamanho das fotos enviadas para o servidor, a macro de teste preparada para o Shoulda, a facilidade para configurar o acesso ao Amazon S3, entre outros detalhes que valorizam o plugin.

Enfim, não existe um grande motivo que chegue a desvalorizar o famoso attachment_fu ou torná-lo obsoleto. São apenas alguns pequenos detalhes que me conquistaram, só isso. É puramente uma questão de preferência  pessoal.

Não importa qual plugin de upload você use, só não esqueça do :multipart => true na construção do formulário!

Usando o Paperclip em 3 passos

  1. Instale o plugin em seu projeto Rails:
./script/plugin install git://github.com/thoughtbot/paperclip.git
  1. Adicione três colunas na tabela que armazenará os dados dos arquivos:
class AddAvatarColumnsToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :avatar_file_name,    :string
    add_column :users, :avatar_content_type, :string
    add_column :users, :avatar_file_size,    :integer
    add_column :users, :avatar_updated_at,   :datetime
  end

  def self.down
    remove_column :users, :avatar_file_name
    remove_column :users, :avatar_content_type
    remove_column :users, :avatar_file_size
    remove_column :users, :avatar_updated_at
  end
end
  1. Adicione uma linha no modelo com as configurações desejadas (tive de dividir em mais linhas para caber no blog):
class User < ActiveRecord::Base
  has_attached_file :avatar,
                    :styles => { :medium => "300x300>",
                                 :thumb => "100x100>" }
end

Leve ao forno e sirva à vontade!

No exemplo acima acabamos de adicionar um avatar (a famosa fotinha) para os usuários. Para recuperar a foto enviada pelo usuário, use:

<%= image_tag @user.avatar.url %>
<%= image_tag @user.avatar.url(:medium) %>
<%= image_tag @user.avatar.url(:thumb) %>

O attachment_fu também não é tão diferente disso, mas gosto mais do Papeclip. Apenas para fechar o artigo, um bônus! Para testar se o Paperclip está funcionando você pode pegar a macro para Shoulda, e depois adicionar uma linha ao teste do modelo:

class UserTest < Test::Unit::TestCase
  should_have_attached_file :avatar
end

Excelsior!

Comments