Creación del proyecto:
rails new crazy4cats -d postgresql
Modificar datos de conexión a través de credenciales:
BASH
EDITOR="code --wait" rails credentials:edit
CMD
set EDITOR=code --wait && rails credentials:edit
Modifica los valores de conexión
db: username: user_db password: password_db
En el archivo config/database.yml carga los valores
username: <%= Rails.application.credentials.db[:username] %> password: <%= Rails.application.credentials.db[:password] %>
Ahora corremos el comando para crear la base de datos: rails db:create
Marcelo busca poder publicar sus aventuras con sus gatos y espera que todos sus usuarios puedan hacer lo mismo, podrán dar Me gusta o no me gusta a cada publicación que se suba a la página web
Los comentarios pueden ser anónimos como hechos por un usuario. Por último, solicita poder entrar el de cualquier ubicación
erDiagram
USERS ||--|{ REACTIONS :has
PUBLICATION ||--|{ REACTIONS :has
1. añadir Devise al Gemfile:
gem 'devise'
2. actualizar la instalación:
bundle
3. instalar el generador de Devise:
rails generate devise:install
Crear el modelo de usuario con el generador de Devise:
rails generate devise User name role:integer
En el archivo generado en db/migrate/2…28_devise_create_users.rb definimos lo siguiente:
t.integer :role, default: 0
Generar un scaffold para el modelo Publicación:
rails g scaffold Publication banner title content:text
Generar una migración para añadir la relación de usuarios a las publicaciones:
rails g migration AddUsersToPublications user:references
Generar un modelo para Comentario:
rails g model Comment user:references publication:references body:text
Generar el modelo para Reacción:
rails g model Reaction kind publication:references user:references
Y corremos la migración: rails db:migrate
Añadimos la asociación en app/models/user.rb y añadimos los roles usando el método enum :
has_many :comments, dependent: :destroy has_many :reactions has_many :publications, through: :reactions enum :role, [:normal_user, :admin]
Añadimos la asociación en app/models/publication.rb y agregando lo siguiente:
belongs_to :user has_many :comments, dependent: :destroy has_many :reactions has_many :users, through: :reactions
Validamos la cantidad de reacciones en el modelo app/models/reaction.rb y un método para mostrar los tipo de reacciones:
belongs_to :publication, optional: true belongs_to :user validates :kind, acceptance: { accept: %w[like dislike] } def self.kinds %w[like dislike] end
Generamos el controlador para las reacciones:
rails g controller reactions
Agregamos el método para reaccionar y limitar la acción en app/controllers/reactions_controller.tb:
before_action :authenticate_user! def user_reaction @user = current_user @publication = Publication.find(params[:publication_id]) reaction = Reaction.find_by(user_id: @user.id, publication_id: @publication.id) if reaction return flash.now[:alert] = 'Ya haz reaccionado a esta publicación' else @new_reaction = Reaction.new(user_id: @user.id, publication_id: @publication.id) respond_to do |format| if @new_reaction.save! format.html { redirect_to publication_path(@publication), notice: "Haz reaccionado con un #{@new_reaction.kind}"} else format.html { redirect_to publication_path(@publication), status: :unprocessable_entity } end end end end
Configuramos la ruta en config/routes.rb:
post '/reactions', to: 'reactions#user_reaction', as: 'user_reaction'
Agregamos un partial en app/views/reactions/_option.html y añadimos lo siguiente:
<div class="container">
<ul>
<% Reaction.kinds.each do |kind| %>
<li>
<%= button_to "#{kind}", user_reaction_path(publication_id: @publication.id, kind: kind), method: :post %>
</li>
<% end %>
</ul>
</div>
Agregamos un partial en app/views/reactions/_counter.html y añadimos lo siguiente:
<div class="container">
<ul>
<% Reaction.kinds.each do |kind| %>
<li>
<%= @publication.reactions.where(kind: kind).count %> - <%= kind %>
</li>
<% end %>
</ul>
</div>
Agregamos el partial en app/views/publications.html.erb: