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
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
@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
Muito obrigado.
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 ?