Kuidas lisada rööbastele meeldimist ja mitte meeldimist

Meie Makers Akadeemia inseneriprojekti 2. nädal on alanud. Meil on siiani olnud rööbastega suurepärane kogemus ja nüüd tunneme, et hakkame tegelema keerukamate külgedega. See juhend on kiire sissejuhatus meeldimiste lisamisele postitustele.

Looge kontroller ja mudel

Kõigepealt peate genereerima mudeli:

rööpad g mudel Nagu postitus: viited kasutaja: viited

Seejärel migreerige tabel:

rööpad db: rändama

Ja lõpuks lisage kontroller:

rööpad g kontrollerile meeldib

Lisage kontrollerile loomismeetod

klass LikesController 
  def luua
    @ post.likes.create (user_id: current_user.id)
    suunata ümber postitee (@post)
  lõpp
  privaatne
  def leidmise postitus
    @post = Post.find (parameetrid [: post_id])
  lõpp
lõpp

Lisage rakendus: vaated / postitused / show.html.erb see kood:

<% = nupp_meeldimiseks, post_likes_path (@post), meetod: post%>

Peske marsruudil marsr.rb kommentaaride ressurss postituste ressursi sees:

ressursid: postitused teevad
  ressursid: meeldib
lõpp

Nüüd looge üksikutele suhe postituste / kasutajate ja meeldimiste vahel. Sa teed seda nii:

Rakendustes / mudelid / post.rb ja rakenduses / mudelid / user.rb lisage rida:

has_many: meeldib, sõltub:: hävitada

Esimene osa annab seose postituste / kasutajate ja nende meeldimiste vahel. Teine osa tagab, et postituse / kasutaja kustutamisel kustutatakse kõik nende meeldimised.

Lisage rakenduses / vaatamised / postitused / show.html.erb see rida, et kuvada, kui palju postitusi meeldib:

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

Seejärel lisage rakenduses / views / posts / index.html.erb see rida, et kuvada, mitu postitust meeldib meililehel:

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

See näitab meeldimiste arvu. Pärast seda on loogika natuke olenevalt numbrist muutuda väärtuseks Meeldib või Likes.

Lõpetage inimeste meeldimine rohkem kui üks kord

Esmalt peame lisama meetodi, et kontrollida, kas kasutajale on foto juba meeldinud. Sõna privaatne lisage:

def juba_meeldinud?
  Like.where (user_id: current_user.id, post_id:
  parameetrid [: post_id]) on olemas?
lõpp

Seejärel muutke oma loomismeetodit selle arvestamiseks

def luua
  kui juba_meeldinud?
    flash [: teate] = "Teile ei saa meeldida rohkem kui üks kord"
  muud
    @ post.likes.create (user_id: current_user.id)
  lõpp
  suunata ümber postitee (@post)
lõpp

Väljend „if” kontrollib, kas andmebaasis leidub sarnaseid andmeid praeguse kasutajanime ja praeguse post_idiga, mis tähendab, et neile peab see juba meeldima. Kui jah, siis ei lisa me muud sarnast ja vilkume veateadet.

Vastupidise funktsiooni lisamine

Meeldimiskontrollerisse peame lisama hävitusmeetodi:

def hävitama
  kui! (juba meeldinud?)
    flash [: teade] = "Ei saa erineda"
  muud
    @ like.destroy
  lõpp
  suunata ümber postitee (@post)
lõpp

Selle meetodi puhul veendun ka, et nad ei erineks siis, kui neile pole meeldinud.

Sarnase toote kustutamiseks peate leidma sarnase. Seetõttu peame lisama leidmismeelse meetodi.

def leida_like
   @like = @ post.likes.find (parameetrid [: id])
lõpp

Ja veenduge, et sellel meetodil oleks hävitamismeetod. Pange see kontrolleri ülaossa:

enne_toimingut: leidke sarnaselt, ainult: [: hävita]

Ainus asi, mida nüüd teha, on lisada nupp, mis ei meeldi ja veenduge, et see kuvatakse, kui klõpsate nagu:

<% pre_like = @ post.likes.find {| meeldib | like.user_id == current_user.id}%>
<%, kui pre_like%>
  <% = nupp_ erinevalt 'erinevalt', post_like_path (@post, pre_like), meetod: kustuta%>
<% else%>
  <% = nupp_meeldimiseks, post_likes_path (@post), meetod: post%>
<% lõpp%>

Alustan kõigepealt kasutaja ID abil sarnaste leidmisest. Kui on üks, siis näitan nuppu Erinevalt ja kui ei, siis teen sarnase nupu. Kui kasutaja klõpsab kustutamisel, siis sisestan postituse jms, mille ta leiab leidjapostituse ja leidmise sarnase abil ja hävitab seejärel sarnased.

Ja oletegi valmis!