owned this note changed 2 years ago
Published Linked with GitHub

REQ1: Set-up inicial

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


Contexto principal

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/228_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:

Select a repo