Chat

Koodaamme kahden käyttäjän välisen viestien lähetys- ja lukemistoiminnon. Aloitamme pohtimalla, miten tämän toiminnallisuuden voi mallintaa ja miten se liittyy muuhun ohjelmaan (models). Tämän jälkeen luomme käyttöliittymän (views) ja toiminnallisuuden (controllers) chattia varten.

Täytyy siis koodata mahdollisuudet siihen, että
1) Käyttäjä voi kuulua useampaan keskusteluun ja keskustelulla voi olla kaksi käyttäjää
2) Keskusteluun kuuluu monta viestiä, mutta yksi viesti voi kuulua vain yhteen keskusteluun.

Luodaan mallit Conversation ja Message sekä yhteydet

Luodaan ensin scaffoldaamalla Conversation.

rails g scaffold Conversation

Aja migraatiot

Keskustelukysymykset: Millä komennolla ajat migraatiot? Mitä sen jälkeen kannattaa alkaa tekemään?

Luodaan yhteys käyttäjän ja Conversationin välille

Lue tutoriaali Eli siis, ensimmäinen askel on lisätä app/models/user.rb-tiedostoon

has_and_belongs_to_many :conversations

Sen jälkeen app/models/conversation.rb -tiedostoon

has_and_belongs_to_many :users

Tämä ei vielä riitä. Rails on siitä hyvä että voimme tehdä paljon asioita ymmärtämättä tietokantatauluista erityisemmin. Nyt kyllä pitäisi ymmärtää mitä olemme seuraavaksi tekemässä. Haluamme luoda seuraavanlaisen tietokantataulun

ConversationUsers
user_idconversation_id
11
21
12
32
komennolla

rails g migration CreateConversationsUsers conversation_id:integer user_id:integer

ConversationsUsers on taulu, joka yhdistää Conversationit ja Userit. Jokaisella Conversationilla ja Userilla on oma yksilöllinen numero-ID.

Keskustelukysymys: Mitä kuva esittää?

Tehdään käyttäjäsivulle viestinlähetysmahdollisuus

Otetaan ensin käyttöön AngularJS. Angularia käytetään näkymien ja POST-HTTP-kutsujen lähetykseen. Se on JavaScript-pohjainen. Lisätään app/layouts/application.html.erbiin eli tiedostoon joka ladataan kaikkia muita viewejä näytettäessä script-tagien (script-tageista esimerkki täällä) sisään, tiedoston head-osioon linkki

https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.13/angular.min.js

Keskustelukysymys: Mitä tämä tekee?

Kun olet sisäistänyt täydellisesti mitä linkin koodi tekee, ota se users/show.html.erb-viewin pohjaksi. Vaihda rivien 18 ja 24 user_id receiver_id:ksi. Luodaan seuraavaksi Message-malli ja koodataan MessagesControlleriin pyynnön käsittelevä funktio.

Pyynnön käsittelevä funktio MessagesControlleriin

Luodaan Message-malli komennolla

rails g scaffold Message user_id:integer conversation_id:integer content:string receiver_id:integer

Lisätään message.rb -modeliin

belongs_to :user
belongs_to :conversation


ja user.rb ja conversation.rb- modeliin

has_many :messages

Määritellään routes.rb-tiedostoon reitti

post 'send_message_for_user', to: 'messages#send_message_for_user'

Keskustelukysymys: Mitä send_message_for_user -funktion sisällöksi tulee? Miten debuggaat koodia ongelmien ilmetessä tätä tehdessä?

Ota mallia Nyymi-softan viestienlähetyksestä, esimerkiksi create- tai send_message_for_company -funktioista. Huom. jos et saa toimimaan angularia täydellisesti eli se toimii vain sivun uudelleenlatauksen jälkeen oikein, kokeile

<%= link_to 'Show', user, 'data-no-turbolink' => true %>

tätä users/index.html.erb-tiedostoon (liittyy javascriptien lataukseen oikein)

Saapuneiden viestien näyttäminen kirjautuneelle käyttäjälle

Tarkista ensin, että viestien lähetys toimii. Saat sen helpoiten selville kirjoittamalla rails c - konsoliin

Message.all

Se listaa kaikki Message-oliot ja niiden attribuutit. Tehdään käyttäjän omalle sivulle saapuneiden viestien näyttäminen. Lisää



sopivaan kohtaan users/show.html.erb -tiedostoon.