Tillater kommentarer til Ruby on Rails

I forrige iterasjon, Legg til RESTful Authentication, ble autentisering lagt til bloggen din slik at bare autoriserte brukere kunne opprette blogginnlegg. Denne iterasjonen vil legge til den endelige (og viktigste) funksjonen i bloggopplæringen: kommentarer. Etter at du er ferdig med denne opplæringen, vil brukerne kunne legge inn anonyme kommentarer på blogginnlegg uten å logge seg på.

Å lage kommentardatabasetabeller og -kontroller gjøres mye på samme måte som innleggets databasetabeller og kontroller ble opprettet - ved å bruke stillasgeneratoren. Stillasgeneratoren vil lage RESTful kontrollører, kartveier og opprette databasemigrasjoner. Men før du tar på deg dette, må du tenke på hva en kommentar er og hva datamedlemmene vil være. En kommentar har:

Når du har bestemt deg for hva en kommentares datamedlemmer er, kan du kjøre stillasgeneratoren. Legg merke til at innleggsfeltet er av typen "referanser." Dette er en spesiell type som vil generere et ID-felt for å koble kommentartabellen med innleggstabellen via en fremmed nøkkel.

instagram viewer

Når kontrollerne og migrasjonene er generert, kan du gå videre og kjøre migreringen ved å kjøre db: migrere rake-oppgaven.

Når databasetabellene er på plass, kan du begynne å sette opp modellen. I modellen er ting som datavalidering - for å sikre at nødvendige felt er til stede - og relasjoner kan defineres. To relasjoner vil bli brukt.

Et blogginnlegg har mange kommentarer. Det has_many forholdet krever ingen spesielle felt i innleggstabellen, men kommentertabellen har et postnummer for å koble det til innleggstabellen. Fra rails, kan du si ting som @ post.comments for å få en liste over kommentarobjekter som tilhører @post-objektet. Kommentarer er også avhengig på foreldrenes postobjekt. Hvis Post-objektet blir ødelagt, bør også alle kommentarobjekter for barn bli ødelagt.

En kommentar tilhører et innlegg-objekt. En kommentar kan bare knyttes til et enkelt blogginnlegg. Tilhørighet-til-forholdet krever bare at et enkelt post_id-felt er i kommentartabellen. For å få tilgang til en kommentarens foreldreinnlegg, kan du si noe som @ comment.post i skinner.

Følgende er innlegg og kommentar-modeller. Flere valideringer er lagt til i kommentarmodellen for å sikre at brukere fyller ut de nødvendige feltene. Legg også merke til has_many og tilhører_til forhold.

Kommentarkontrolleren vil ikke bli brukt på den tradisjonelle måten en RESTful kontroller brukes. For det første vil det bare være tilgang til det fra innstillingene fra innlegget. Kommentarskjemaene og visningen er helt og holdent i Vis-handlingen til Post-kontrolleren. Så, til å begynne med, slett hele app / visninger / kommentarer katalog for å slette alle kommentarvisningene. De vil ikke være nødvendig.

Deretter må du slette noen av handlingene fra Kommentar-kontrolleren. Alt som trengs er skape og ødelegge handlinger. Alle andre handlinger kan slettes. Siden Kommenterkontrolleren nå bare er et stubbe uten visninger, må du bytte noen steder i kontrolleren der den prøver å omdirigere til Kommenterkontrolleren. Uansett hvor det er en viderekobling_til samtale, endre den til redirect_to (@ comment.post). Nedenfor er den komplette kommentarcontrolleren.

En av de siste brikkene som skal på plass er kommentarskjemaet, som faktisk er en ganske enkel oppgave. Det er i utgangspunktet to ting å gjøre: opprette et nytt Kommentar-objekt i visningshandlingen til innleggskontrolleren og vise et skjema som sender til opprettingshandlingen til Kommenterkontrolleren. For å gjøre det, endre showhandlingen i innleggskontrolleren slik at den ser ut som følger. Den lagt linjen er fet.

Det siste trinnet er å faktisk vise kommentarer. Det må utvises forsiktighet når du viser brukerinputdata, da en bruker kan prøve å sette inn HTML-koder som kan forstyrre siden. For å forhindre dette h metode benyttes. Denne metoden vil unnslippe alle HTML-koder brukeren prøver å legge inn. I en ytterligere iterasjon kan et merkespråk som RedCloth eller en filtreringsmetode brukes for å la brukere legge ut visse HTML-koder.

Kommentarer vises med en delvis, akkurat som innleggene var. Lag en fil som heter app / visninger / innlegg / _comment.html.erb og legg følgende tekst i den. Den vil vise kommentaren, og hvis brukeren er logget inn og kan slette kommentaren, kan du også vise Destroy-linken for å ødelegge kommentaren.

Til slutt, for å vise alle innleggets kommentarer på en gang, kan du ringe kommentarene delvis med : samling => @ post.comments. Dette vil kalle kommentarene delvis for hver kommentar som hører til innlegget. Legg til følgende linje i visningsvisningen i innleggskontrolleren.

I neste tutorial-iterasjon vil simple_format erstattes med en mer kompleks formateringsmotor kalt RedCloth. RedCloth lar brukere lage innhold med enkel markering som * fet * for fet og _italic_ for kursiv. Dette vil være tilgjengelig for både bloggplakater og kommentarer.