Upload de PDF Fácil e rápido com RSpec e Capybara em Rails

Que Rails é uma linguagem de programação produtiva todo mundo já sabe, então vamos hoje aprender a fazer um upload para PDF de forma correta e com teste!
Irei partir do principio que você já tem na sua Gemfile o RSpec-Rails e o Capybara. Vamos utilizar a GEM CarrierWave

Então, no arquivo spec/feature/rule/creating_rules_spec.rb

#spec/feature/rule/creating_rules_spec.rbrequire ‘rails_helper’feature ‘rule page’ do
let(:user){ FactoryGirl.create(:user) }
before do
visit ‘/rules/new’
end
scenario ‘create a new rule with valid data’ doattach_file(‘Asset’, “#{Rails.root}/spec/fixtures/rule.pdf”)
click_button(‘Create’)
expect(page).to have_content(‘Rule has been created.’)
end
end

Criar uma pasta em spec/fixtures e adicione um arquivo qualquer no formato de pdf.

Terminal

rspec spec/features/rule/creating_rules_spec.rb

Adicionar o código na sua view.(estou utilizando a gem HAML, que faz com que você escreva menos código HTML)

#app/views/rules/new.html.erb= f.label :asset, "File"
= f.input :asset, as: :file, input_html: { id: “input-1”, class: “file form-control col-md-7.col-xs-12”}, label: false

Adicione no seu GEMFILE

gem 'carrierwave'

TERMINAL

bundle install

Agora precisamos aceitar o upload do arquivo e armazenar locamente. O próprio CarrierWave permite a gente definir facilmente. Abra a pasta app/model/OndeDesejaAdicionarATabela.rb no meu por exemplo app/model/rule.rb .

#app/model/rule.rb
mount_uploader :asset, AssetUploader

É necessário gerar o uploader.
TERMINAL

bin/rails generate uploader Asset

Agora precisamos conectar com o nosso Model, então nós precisamos de uma migration.

bin/rails generate migration add_asset_to_rules asset:string

To add these columns to your
development environment’s database, run bin/rake db:migrate . Then run
bin/rake db:test:prepare to add them to your test environment’s
database.
We have one last thing to do: update our controller to allow us to pass in assets.
Change
your
ticket_params
method
in
your
app/controllers/tickets_controller.rb to look like this:

Para adicionar a coluna:
Terminal

rake db:migrate

Da permissão para o controller

#app/controller/rules_controller.rb
def rule_params
params.require(:rule).permit( :asset)
end

Terminal

rspec spec/features/rule/creating_rules_spec.rb

Os testes devem passar!

Written by

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store