Kako dodati volim i ne volim tračnice

Započeo je drugi tjedan našeg inženjerskog projekta Makers Academy. Do sada smo imali veliko iskustvo s tračnicama i sada se osjećamo kao da se bavimo složenijim aspektima. Ovaj je vodič brzi uvod u dodavanje lajkova u postove.

Napravite kontroler i model

Prvo morate generirati model:

tračnice g model Kao post: reference korisnik: reference

Zatim premjestite tablicu:

tračnice db: migrirati

I na kraju, dodajte kontroler:

tračnice g kontroler voli

Dodajte način stvaranja u regulator

klasa LikesController 
  def stvoriti
    @ post.likes.create (user_id: current_user.id)
    redirect_to post_path (@post)
  kraj
  privatna
  def find_post
    @post = Post.find (params [: post_id])
  kraj
kraj

U aplikaciju / views / posts / show.html.erb dodajte ovaj kôd:

<% = button_to 'Like', post_likes_path (@post), metoda:: objava%>

U route.rb gnijezdi se izvor za komentare unutar resursa postova:

resursi: postovi se
  resursi: voli
kraj

Sada uspostavite međusobni odnos između postova / korisnika i lajkova. To radite tako:

U app / models / post.rb i app / models / user.rb dodajte liniju:

has_many: voli, ovisi:: uništiti

Prvi dio daje odnos između postova / korisnika i njihovih lajkova. Drugi dio osigurava da kada izbrišete post / korisnika, brišu se svi njihovi lajkovi.

U aplikaciji / views / posts / show.html.erb dodajte ovaj redak da biste prikazali koliko voli post:

<% = @ post.likes.count%> <% = (@ post.likes.count) == 1? 'Like': 'Sviđa mi se'%>

Zatim u aplikaciju / views / posts / index.html.erb dodajte ovaj redak da biste prikazali koliko voli post na početnoj stranici:

<% = post.likes.count%> <% = (post.likes.count) == 1? 'Like': 'Sviđa mi se'%>

To je da se pokaže broj lajkova. Bit logike nakon toga je da se promijeni u Like ili Likes, ovisno o broju.

Zaustavite ljude da se više vole

Prvo moramo dodati metodu kako bismo provjerili je li korisnik već volio fotografiju. Pod riječju privatno dodajte:

def je već volio?
  Like.where (user_id: current_user.id, post_id:
  parametri [: POST_ID].) postoji?
kraj

Zatim uredite način izrade da biste ga računali

def stvoriti
  ako već volim?
    flash [: notice] = "Ne može vam se svidjeti više od jednom"
  drugo
    @ post.likes.create (user_id: current_user.id)
  kraj
  redirect_to post_path (@post)
kraj

Izjava 'ako' provjerava postoji li u bazi podataka slično kao s trenutnim user_id i trenutnim post_id, što znači da im se sigurno već svidjelo. Ako je to slučaj, ne dodamo još jednu sličnu poruku o pogrešci i bljeskalicu.

Dodavanje značajke za razliku

U kontroler Like moramo dodati metodu uništavanja:

def uništiti
  ako! (već_smiješeno?)
    flash [: notice] = "Ne mogu se razlikovati od"
  drugo
    'like.destroy
  kraj
  redirect_to post_path (@post)
kraj

U ovoj se metodi također pobrinem da se ne razlikuju kada nisu voljeli.

Da biste izbrisali takav, trebate ga pronaći. Stoga trebamo dodati metodu pronalaska.

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

I provjerite je li ova metoda pozvana na metodu uništavanja. Stavite ovo na vrh regulatora:

prije pokretanja: find_like, samo: [: uništiti]

Jedino što trebate učiniti je dodati gumb koji se razlikuje i pobrinite se da se pojavi ako kliknete kao:

<% pre_like = @ post.likes.find {| kao | like.user_id == current_user.id}%>
<% ako pre_like%>
  <% = button_to 'Za razliku od', post_like_path (@post, pre_like), metoda:: delete%>
<% else%>
  <% = button_to 'Like', post_likes_path (@post), metoda:: objava%>
<% kraj%>

Prvo započinjem pronalaženjem sličnog s korisničkim ID-om. Ako postoji gumb, prikazujem gumb za razliku, a ako ne, prikazujem tipku sličnu. Kad korisnik klikne izbriši, prosljeđujem u postu i slično, koje pronalazi koristeći find_post i find_like, a zatim uništava slično.

I gotovi ste!