Por que Paperclip?

12 de novembro de 2008  |  Open Source, Opinião  | 

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

2. 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

3. 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!


18 Comentários


  1. Acompanho sempre o que o pessoal da thoughtbot anda fazendo, os plugins deles são muito úteis e simples.

    Agora fiquei curioso para saber porque você não usa mais o Shoulda.

  2. bem, se eu quiser utilizar o paperclip em vez do attachment_fu, eu criou uma nova migration, para add as colunas nas tables daquele model em vez de se criar um model? como é utilizado no attachment_fu é isso?

  3. Herminio,

    Você pode encontrar mais informações sobre o attachment_fu aqui: http://github.com/technoweenie/attachment_fu/wikis

  4. Parece ser mais simples que o attacment_fu mesmo.
    Mas se eu quiser, por exemplo, montar um album, não dá pra usar o Paperclip, não é isso?

  5. Lucas,

    Claro que dá! Aliás, o projeto que trabalhei com ele era uma rede social (para variar) e incluía uma tabela de fotos polimórfica que servia para usuários, grupos e outras coisas.

  6. Dããããannn! É lógico que dá! :)

  7. Carlos,
    quando você faz isto:

    has_attached_file :avatar,
      :styles => {
        :medium => "300×300>",
        :thumb => "100×100>" }

    Você sempre está usando a mesma imagem, não importa a resolução, apenas redimensiona a imagem grande como se estivesse setando o width e height da tag da HTML certo?

    E se caso eu queira, na hora do upload, redimensionar a mesma imagem em 2 ou 3 tamanhos diferentes, e gerando os arquivos separadamente, e gravar suas urls, isto é possível com o Paperclip?

  8. Ricardo,

    Na verdade na linha acima, eu estou fazendo exatamente o que você quer. Serão criadas 2 imagens uma com 300×300 e outra 100×100.

    E para recuperar basta usar o código de exemplo com o image_tag.

  9. Hum… show de bola!!!

  10. ./script/plugin install git://github.com/thoughtbot/paperclip.git

    isso é somente em versoes > que a 2???

  11. Carlos, acho que você esqueceu de adicionar a coluna avatar_updated_at na migration AddAvatarColumsToUser, já que a documentação do plugin no GitHub inclui ela, e aqui não funcionou sem essa quarta coluna.

  12. Tem como usar o Paperclip para fazer upload de swf e vídeos?

    Abraço.

  13. Carlos, mas como vc fez a galeria com o Paperclip?

  14. Toda vez que uso

    :styles => {
    :medium => “300×300>”,
    :thumb => “100×100>” }

    Dá error

Trackbacks

  1. Paperclip Rails | StartAPP
  2. Paperclip Rails | Planeta Globo.com

Deixe um comentário