Se crea la aplicación con base de datos postgres:
Configuramos los parámetros de conexión y creamos la base de datos:
Diagrama entidad relación:
Los usuarios vamos gestionarlos usando Devise:
Corremos el generador de devise:
Vamos a generar las vistas de Devise:
Ahora generamos el modelo de Devise:
Añadimos los atributos adicionales mediante una migración:
Ahora la guía nos dice que agreguemos los strong params:
En la guía el siguiente paso es agregar los campos al formulario de registro:
El siguiente paso que propone la guía es crear el modelo Country:
Lo siguiente es hacer un scaffold de Articles:
OJO: En la guía aparece en el comando la palabra en plural (articles), pero debemos usarlo en singular y además el campo description tiene que ser de tipo text ya que es menos limitado que el string por defecto.
Ahora podemos seguir con el modelo de Comment:
Ahora hacemos lo mismo para Reaction:
Ojo: La guía en este punto nos dice que debemos revisar la migración, para asegurarnos de que article_id
y comment_id
en lo que es el modelo de Reaction permitan tener valores nulos o sea, es decir; null: true
.
Teniendo en cuenta la consideración anterior, el archivo de migración que crea la tabla Reaction se vería de la siguiente forma:
Y ahora ejecutamos la migración con rails db:migrate
.
Vamos a validar y añadir las relaciones 'asociaciones' correspondiente entre los modelos. Comenzando con el modelo Article:
Lo que tenemos establecido en el modelo es lo siguiente:
belongs_to :country
- Un artículo pertenece a un País.has_many :comments, dependent: :destroy
- Un artículo puede tener muchos comentarios, y con dependent: :destroy
le estamos diciendo que cuando se elimine el artículo, se eliminen sus comentarios asociados.has_many :reactions, dependent: :destroy
- Un artículo puede tener muchas reacciones, y como mencione anteriormente dependent: :destroy
configurará la eliminación en cascada.has_many :users, through: :reactions
- Un artículo puede tener muchas reacciones a través de los usuarios, podríamos haber usado comentarios en vez de los usuarios conseguimos el mismo resultado.Ahora vamos al modelo de Comentario:
belongs_to :article
- Un comentario le pertenece a un artículo.belongs_to :user
- Un comentario le pertenece a un usuario.has_many :reactions, dependent: :destroy
- Un comentario puede tener muchas reacciones, y también implementa la eliminación en cascada.Seguimos con el modelo de Country:
has_many :articles
- En un país se pueden publicar muchos artículos, si eliminamos ese país todos sus artículos asociados también se eliminan.Vamos con el modelo Reaction:
belongs_to :article, optional: true
- Una reacción pertenece a un artículo con optional: true
le estamos diciendo que no valide la presencia del objeto asociado. De forma predeterminada, esta opción está establecida en false
por lo que el objeto asociado es obligatorio.belongs_to :user
- Una reacción le pertenece a un usuario.belongs_to :comment, optional: true
- Una reacción le pertenece a un artículo y como sabemos optional: true
no validará la presencia del objeto asociado.Ahora seguimos con el modelo de User:
Ahora en la guía nos dice que debemos arreglar el problema de inicio de sesión de Devise con la siguiente línea (podemos decomentarla si vamos a la línea 266):
Integramos la gema Faker al proyecto:
Ahora vamos agregar datos de prueba en el archivo db/seeds.rb:
Ahora el siguiente paso es establecer la ruta raíz con la página de artículos:
En la guía ahora nos dice agregar los tipos de reacciones como constantes:
Ahora agregamos el controlador, método y ruta para crear reacciones:
Abrimos el controlador app/controllers/reactions_controller.rb:
El siguiente paso en la guía es añadir la ruta para reaccionar en config/routes.rb:
Ahora agregamos el botón para crear reacciones en la vista show.html.erb:
Ahora generamos el controlador para los comentarios:
Ahora podemos definir el método para crear comentarios:
Y ahora en la guía nos dice que debemos añadir lo siguiente:
Lo siguiente es crear un partial en app/views/comments/_form.html.erb para el formulario de comentarios:
Ahora nos vamos a la vista show de lo artículos para renderizar el partial:
Como nos señala la guía, debemos agregar comentarios al controlador show de artículos:
Ahora creamos un partial en app/views/comments/_article_comments.html.erb del artículo:
Ahora lo renderizamos en la vista show del artículo:
Ahora agregamos comentarios y reacciones al seed:
Cambiamos la forma en que se muestra el parámetro when_went
en un partial en app/views/articles/_article.html.erb:
Si quieres partir desde lo último puedes clonar este repositorio:
https://github.com/enidev911/travelGuide
Añadimos bootstrap para los estilos vía CDN: