Com afegir plaer i disgust als rails

Ha començat la segona setmana del nostre projecte d’enginyeria de Makers Academy. Fins ara hem tingut una gran experiència amb rails i ara sentim que estem enfrontant-nos als aspectes més complicats. Aquesta guia és una breu introducció per afegir "m'agrada" a les publicacions.

Construeix el controlador i el model

Primer cal generar el model:

Model Rails g Com a publicació: referències usuari: referències

A continuació, migreu la taula:

Rails db: migrar

Finalment, afegiu el controlador:

M'agrada a Rails g

Afegiu el mètode create al controlador

Class LikesController
def create @ post.likes.create (user_id: current_user.id) redirect_to post_path (@post) end
Privat
def find_post @post = Post.find (params [: post_id]) final
El final

A app / views / posts / show.html.erb afegiu aquest codi:

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

A routes.rb niueu el recurs de comentaris al recurs de publicacions:

Recursos: publicacions fan Recursos: li agrada el final

Ara estableix la relació d'un a molts entre publicacions / usuaris i m'agrada. Ho fas així:

A app / models / post.rb i app / models / user.rb, afegiu la línia següent:

has_many: likes, dependent :: destroy

La primera part indica la relació entre les publicacions / usuaris i els seus likes. La segona part garanteix que quan suprimiu una publicació / usuari, se suprimiran tots els M'agrada.

A app / views / posts / show.html.erb, afegiu aquesta línia per mostrar el nombre d’agradaments que té una publicació:

<% = @ post.likes.count%> <% = (@ post.likes.count) == 1? "M'agrada": "M'agrada"%>

A continuació, afegiu aquesta línia a app / views / posts / index.html.erb per mostrar quants m'agrada una publicació a la pàgina d'inici:

<% = post.likes.count%> <% = (post.likes.count) == 1? "M'agrada": "M'agrada"%>

Aquí es mostra el nombre d’agradats. El bit lògic posterior és canviar a "M'agrada" o "M'agrada" en funció del nombre.

Deixeu que a la gent li agradi més d’una vegada

Primer, hem d’afegir un mètode per comprovar si un usuari ja ha agradat una foto. Sota la paraula privat, afegiu:

def ja t'ha agradat? Igual que a on existeix (user_id: current_user.id, post_id: params [: post_id])? El final

A continuació, editeu el mètode de creació per tenir-ho en compte

voleu crear def si ja us ha agradat? flash [: notice] = "No us pot agradar més d'una vegada" else @ post.likes.create (user_id: current_user.id) end redirect_to post_path (@post) end

La sentència "if" comprova si hi ha un "m'agrada" a la base de dades amb el "user_id" i el "post_id" actuals. Això vol dir que ja han de tenir "m'agrada". En aquest cas, no afegim cap altre "m'agrada" i no emetem cap missatge d'error.

Afegint una funció diferent

Al controlador de M'agrada hem d'afegir un mètode Destroy:

def destruir si! (ja m'ha agradat?) flash [: notice] = "No pot ser d'una altra manera" en cas contrari @ like.destroy end redirect_to post_path (@post) end

Amb aquest mètode, també m'asseguro que no siguin diferents si no els agrada.

Per suprimir un M'agrada, l'heu de trobar. Per tant, hem d’afegir un mètode find_like.

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

Assegureu-vos que aquest mètode es faci servir al mètode de destrucció. Poseu-ho a la part superior del controlador:

before_action: find_like, only: [: destruir]

Ara tot el que podeu fer és afegir un botó que no us agradi i assegureu-vos que aparegui quan feu clic al botó M'agrada:

<% pre_like = @ post.likes.find {| com | like.user_id == current_user.id}%> <% if pre_like%> <% = button_to 'opposit', post_like_path (@post, pre_like), method :: delete%> <% else%> <% = button_to 'like ', post_likes_path (@post), method :: post%> <% end%>

Començaré trobant la coincidència amb l’identificador d’usuari. Si n'hi ha, mostraré el botó oposat i, si no, mostraré el botó M'agrada. Quan l’usuari fa clic a Suprimeix, faig entrega de la publicació i coses semblants que troben mitjançant find_post i find_like, i després destrueixo les coses semblants.

I ja està!