Seguindo nosso CRUD, vamos trabalhar nesse post, a alteração de dados (Update).
Primeiramente crie o arquivo para testar o processo de alteração. Em spec/features/products
crie mais um arquivo nomeado editing_products_spec.rb
. Nesse arquivo adicione
o seguinte código:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Rode os testes e um erro devido a falta do link “Editar” será apresentado pelo rspec.
1 2 3 |
|
Precisamos adicionar o link de edição a listagem de produtos. Vamos lá, no arquivo de
template app/views/products/index.html.erb
adicione na listagem de dados, o link de edição:
1 2 3 4 5 6 7 |
|
Mas somente isso não é suficiente, precisamos usar o FactoryGirl novamente, para ao menos termos um registro e assim a nossa listagem ter o link. Ao teste adicione no início do bloco before:
1 2 3 4 5 6 |
|
Rode seu teste e ocorrerá um erro devido a falta de uma ação edit em nosso controlador. Adicione:
1 2 3 4 5 6 7 8 9 10 |
|
Rodando novamente os testes, teremos um erro pela falta do nosso template de edição.
Adicione um arquivo de template em app/views/products/edit.html.erb
. Agora nosso
teste está passando. Ou seja, nossa aplicação já tem um página de edição. Nosso próximo
passo e exibir um formulário com os dados e alterá-los.
Carregando os dados no formulário de edição
Editando os dados
Vamos començar pelo nosso teste, onde vamos preencher o campo nome do produto, na verdade vamos modificar o valor que deverá estar carregado. Adicione ao teste:
1 2 3 4 5 6 7 |
|
Rode o teste. E teremos o error:
Failure/Error: fill_in ‘Nome’, with: ‘Produto 1’
Capybara::ElementNotFound:
Unable to find field "Nome"
Ok, não temos o nosso form e o campo Nome no formulário de edição. Vamos reaproveitar
o formulário, usando o atual formulário de novo cadastro, tudo isso com o uso de
partials. Crie no diretório app/views/products/
o arquivo _form.html.erb
.
No arquivo edit.html.erb
(crie ele se existir) implemente a chamada do partial:
1 2 3 |
|
Abra o arquivo new.html.erb e transfira o codigo do formulário para o arquivo _form.html.erb, não esquecendo de adiocionar a chamada do partial ao formulário.
1 2 3 |
|
Já o partial ficará assim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Obs: Mude o click_button do teste de novo registro para “Salvar”.
Rode o teste rspec spec/features/products/editing_products_spec.rb
. Erros, erros novamente…
ok mas isso é devido que temos a váriavel @product
e nosso controller ela não existe. Vamos
a implementação no nosso controller. Vamos encontrar o registro que queremos editar, usando
o id que é passado a action edit junto com os params da requisição:
1 2 3 4 5 6 7 8 9 |
|
Rode o teste o erro agora é diferente e bem claro. Pois queremos gravar a alteração e o método de update não existe. Crie ele e adicione o código para realizar a alteração
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Ao rodarmos o teste, ele vai passar. Agora vamos colocar uma cenário de teste negativo. Deixaremos o campo nome em branco e vamos submeter, o campo nome é obrigatório, logo uma mensagem de validação vai ser retornada, impedindo que a alteração aconteça:
1 2 3 4 5 6 7 8 9 10 |
|
E para finalizar adicione uma mensagem de alerta para quando ocorrer uma falha:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Rode seus testes, e tudo estará verde. Finalizamos mais uma etapa, o código fonte como sempre estará no meu github. Até..