Cómo agregar me gusta y no me gusta en los rieles

La semana 2 de nuestro proyecto de ingeniería de la Academia Makers ha comenzado. Hasta ahora hemos tenido una gran experiencia con los rieles y ahora sentimos que nos estamos familiarizando con los aspectos más complicados. Esta guía es una introducción rápida para agregar Me gusta a las publicaciones.

Crea el controlador y el modelo

Primero deberá generar el modelo:

rieles g modelo Like post: referencias usuario: referencias

Luego, migre la tabla:

rieles db: migrar

Y finalmente, agregue el controlador:

rieles g me gusta controlador

Agregue el método de creación al controlador

class LikesController 
  def crear
    @ post.likes.create (user_id: current_user.id)
    redirect_to post_path (@post)
  fin
  privado
  def find_post
    @post = Post.find (parámetros [: post_id])
  fin
fin

En app / views / posts / show.html.erb agregue este código:

<% = button_to 'Me gusta', post_likes_path (@post), método:: post%>

En routes.rb anida el recurso de comentarios dentro del recurso de publicaciones:

recursos: las publicaciones hacen
  recursos: me gusta
fin

Ahora establezca la relación uno a muchos entre publicaciones / usuarios y me gusta. Haces esto así:

En app / models / post.rb y app / models / user.rb agregue la línea:

has_many: me gusta, dependiente:: destruir

La primera parte da la relación entre las publicaciones / usuarios y sus gustos. La segunda parte se asegura de que cuando eliminas una publicación / usuario, todos sus Me gusta se eliminen.

En app / views / posts / show.html.erb, agregue esta línea para mostrar cuántos me gusta tiene una publicación:

<% = @ post.likes.count%> <% = (@ post.likes.count) == 1? 'Me gusta': 'Me gusta'%>

Luego, en app / views / posts / index.html.erb, agregue esta línea para mostrar cuántos me gusta tiene una publicación en la página de inicio:

<% = post.likes.count%> <% = (post.likes.count) == 1? 'Me gusta': 'Me gusta'%>

Esto es para mostrar la cantidad de me gusta. El poco de lógica después es cambiar a Me gusta o Me gusta dependiendo del número.

Deja de que a la gente le guste más de una vez

Primero necesitamos agregar un método para verificar si a un usuario ya le ha gustado una foto. Debajo de la palabra privado, agregue:

def ya le ha gustado?
  Like.where (user_id: current_user.id, post_id:
  params [: post_id]). existe?
fin

Luego edite su método de creación para tenerlo en cuenta

def crear
  si ya te ha gustado?
    flash [: notice] = "No te puede gustar más de una vez"
  más
    @ post.likes.create (user_id: current_user.id)
  fin
  redirect_to post_path (@post)
fin

La instrucción "si" verifica si hay un me gusta en la base de datos con el ID de usuario actual y el Post_id actual, lo que significa que ya les debe haber gustado. Si es así, no agreguemos otro me gusta y muestremos un mensaje de error.

Agregar la característica diferente

En el controlador Me gusta, necesitamos agregar un método de destrucción:

def destruir
  si! (ya me gustó?)
    flash [: notice] = "No puede ser diferente"
  más
    @ like.destroy
  fin
  redirect_to post_path (@post)
fin

En este método también me aseguro de que no sean diferentes cuando no les ha gustado.

Para eliminar un me gusta, debes encontrarlo. Por lo tanto, necesitamos agregar un método find_like.

def find_like
   @like = @ post.likes.find (params [: id])
fin

Y asegúrese de que este método se invoque en el método de destrucción. Pon esto en la parte superior del controlador:

before_action: find_like, only: [: destroy]

Lo único que debe hacer ahora es agregar un botón diferente y asegurarse de que aparezca si hace clic en Me gusta:

<% pre_like = @ post.likes.find {| like | like.user_id == current_user.id}%>
<% if pre_like%>
  <% = button_to 'A diferencia', post_like_path (@post, pre_like), método:: delete%>
<% más%>
  <% = button_to 'Me gusta', post_likes_path (@post), método:: post%>
<% end%>

Primero comienzo con encontrar el me gusta con la identificación de usuario. Si hay uno, muestro el botón Diferenciar y si no, renderizo el botón Me gusta. Cuando el usuario hace clic en Eliminar, paso la publicación y similares, que encuentra usando find_post y find_like y luego destruye el like.

¡Y tu estas listo!