1.5: Validaciones - wyeworks/rails-workshop-2017-dia-1 GitHub Wiki
El objetivo de esta parte es definir algunas reglas que tienen que cumplir los boards que se agreguen en nuestra aplicación. Veremos como Rails nos permite fácilmente declarar las mismas.
Agregamos validaciones en el modelo Board, las cuales van a generar un error cada vez que se intente guardar un board que no cumpla esas condiciones:
# app/models/board.rb
class Board < ApplicationRecord
validates :name, presence: true
validates :visibility, inclusion: { in: %w(public private) }
endProbamos ejecutar esas validaciones usando la consola de Rails. Debemos correr el comando:
$ rails console
Loading development environment (Rails 5.0.0.1)
irb(main):001:0>Esto nos abre una sesión interactiva donde podemos ejecutar código Ruby con todo el código de la app precargado.
En la consola, probamos crear una nueva instancia de Board sin datos y comprobamos que las validaciones nos devuelven una lista de errores
$ rails console
irb(main):001:0> board = Board.new
=> #<Board id: nil, name: nil, visibility: nil, favorite: nil, created_at: nil, updated_at: nil>
irb(main):002:0> board.valid?
=> false
irb(main):003:0> board.errors.full_messages
=> ["Name can't be blank", "Visibility is not included in the list"]Para salir de la consola de rails se usa el comando exit.
Probemos en este punto ver si los tests pasan. Vamos a comprobar que tenemos errores que son causados por las validaciones que introdujimos.
$ rails test
...F
Failure:
BoardsControllerTest#test_should_update_board [/home/vagrant/workshop/trello-app/test/controllers/boards_controller_test.rb:38]:
Expected response to be a <3XX: redirect>, but was a <200: OK>
bin/rails test test/controllers/boards_controller_test.rb:36
.F
Failure:
BoardsControllerTest#test_should_create_board [/home/vagrant/workshop/trello-app/test/controllers/boards_controller_test.rb:19]:
"Board.count" didn't change by 1.
Expected: 3
Actual: 2Actualizamos los fixtures que nos generó el scaffold de Rails para que tengan datos válidos y no fallen los tests por las validaciones que agregamos.
# test/fixtures/boards.yml
one:
name: MyString
visibility: private
favorite: false
two:
name: MyString
visibility: public
favorite: falseCorremos los tests y comprobamos que pasan todos.
$ rails test
Run options: --seed 39953
# Running:
.......
Finished in 5.172506s, 1.3533 runs/s, 1.7400 assertions/s.
7 runs, 9 assertions, 0 failures, 0 errors, 0 skipsgit add -A
git commit -m "Validaciones"