Home > desenvolvimento > Upload de arquivos com rails 3 e paperclip

Upload de arquivos com rails 3 e paperclip

Brincando com algumas coisas básicas que muitas apps tem, decidi testar quão fácil é fazer upload de um arquivo em uma app rails. Minha intenção era fazer só o básico mesmo, sem considerar assuntos como segurança, arquivos muito grandes, etc.
Dando uma pesquisada rápida, a melhor opção me pareceu o PaperClip. Ele é bem simples, tem uma boa documentação e aparentemente o
pessoal usa bastante.
Então, pra começar, vou criar um projeto rails (minha versão é a 3.0.3, ruby 1.9.2 com banco mysql), para fazer upload de curriculos.
Não vou falar sobre a instalação do ruby, rails e mysql. Parto do principio que já está tudo instalado em sua máquina. Como o objetivo é fazer upload, vou manter tudo bem simples, com somente um modelo.
Criando a aplicação, que se chamará curriculum (não esqueça de criar o banco e configurar o database.yml):
rails new curriculum -d mysql
Nosso aplicação vai cadastrar uma pessoa, que poderá anexar seu currículo. Vamos gerar o scaffold para Person com os campos:
name, cidade e ocupação pretendida.
rails generate scaffold Person name:string city:string occupation:string
Depois execute:
rake db:migrate
para criação da tabela. Se não deu nenhum erro e quiser conferir se a aplicação está no ar, é só executar rails server e acessar http://localhost:3000/people . Deverá aparcer a tela de listagem de pessoas.
Feito isso, é hora de acrescentar a funcionalidade de upload em nossa aplicação. Aqui, vou usar como gem ao invés de plugin. Para isso basta colocar
a seguinte linha no seu arquivo GemFile
gem "paperclip", "~> 2.3"
e executar o bundle.
Agora vamos alterar o nosso modelo para que ele possa lidar a nova feature. Para tanto, basta acrescentar
has_attached_file :resume no modelo de Person, ficando assim:
class Person < ActiveRecord::Base
    has_attached_file :resume
end
Após isso, é preciso alterar nosso banco de dados para armazenar o caminho no qual o arquivo será armazenado.
digite:
rails generate migration add_resume_file_name_to_person
Depois edite o arquivo gerado para ficar parecido com
class AddResumeFileNameToPerson < ActiveRecord::Migration
   def self.up
      add_column :people, :resume_file_name,    :string
   end

   def self.down
      remove_column :people, :resume_file_name
   end
end

Aí é só executar novamente rake db:migrate e alterar o seu form (_form.html.erb), para ficar assim:

<% form_for :person, @person, :url => people_path, :html => { :multipart => true } do |f| %>

<% if @person.errors.any? %>
   <div id="error_explanation">
   <h2><%= pluralize(@person.errors.count, "error") %> prohibited this person from being saved:</h2>

   <ul>
   <% @person.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
   <% end %>
   </ul>
   </div>
<% end %>

<div>
  <%= f.label :name %><br />
  <%= f.text_field :name %>
</div>
<div>
  <%= f.label :city %><br />
  <%= f.text_field :city %>
</div>
<div>
  <%= f.label : occupation %><br />
  <%= f.text_field : occupation %>
</div>

<div>
  <%= f.label :resume %><br />
  <%= f.file_field :resume %>
</div>

<div>
  <%= f.submit %>
</div>
<% end %>

Depois é subir o server e se tudo ocorreu bem, fazer upload dos seus currículos.

Para mostrar um link na tela de listagem, deixe-a conforme abaixo:

<h1>Listing people</h1>

<table>
  <tr>
    <th>Name</th>
    <th>City</th>
    <th>Occupation</th>
    <th>Resume link</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>

<% @people.each do |person| %>
  <tr>
    <td><%= person.name %></td>
    <td><%= person.city %></td>
    <td><%= person.occupation %></td>
    <td><%= link_to 'View Resume', person.resume.url %></td>
    <td><%= link_to 'Show', person %></td>
    <td><%= link_to 'Edit', edit_person_path(person) %></td>
    <td><%= link_to 'Destroy', person, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
</table>

<br />

<%= link_to 'New Person', new_person_path %>

Para saber mais detalhes, como: onde o arquivo é armazenado fisicamente e porque,  quais outras opções de configuração, etc basta acessar a página do projeto do GitHub:

https://github.com/thoughtbot/paperclip

Categories: desenvolvimento Tags: , , ,
  1. Rafael
    February 21st, 2011 at 10:57 | #1

    Sou iniciante no mundo do rails e com isso não estou conseguindo entender onde os arquivos estão sendo salvos.

    Se alguem puder dar uma mão.

    obrigado

  2. Rodrigo
    February 23rd, 2011 at 07:32 | #2

    @Rafael

    Olá Rafael,

    Por default, os arquivos são guardados dentro da pasta public/system/ do seu projeto rails. Mas esse caminho pode ser alterado.

    []‘s

  3. Rafael
    February 23rd, 2011 at 13:38 | #3

    Muito obrigado.

  4. sergio
    June 1st, 2011 at 10:59 | #4

    Pessoal procurei na documentação e não achei , mas veja minha situação
    tenho o seguinte codigo
    has_attached_file :upload, :path => “:rails_root/public/images/uploads/:id/:basename.:extension”, :url => “/images/uploads/:id/:basename.:extension”

    o que eu queria era mudar o :id para :textodousuario só que em vez de ele gravar o texto do usuario que foi digitado ele grava a pasta exatamente assim :textodousuario, vcs sabem como altero isso ?

  1. No trackbacks yet.