În partea I a acestei serii, ați văzut cum am realizat o aplicație mobilă simplă în cadrul Corona care răspunde unei acțiuni asemănătoare unei "lovituri" (numită "tampon") pentru a trimite un mesaj către un alt dispozitiv mobil. Comunicarea dintre cele două dispozitive mobile are loc între un proces de server intermediar care se potrivește cu două dispozitive "înfricoșate" atât de timbru, cât și de distanță. În acest tutorial, vom configura procesul serverului intermediar cu Ruby on Rails.
Să începem prin crearea proiectului nostru. Deoarece vom folosi pluginul geokit pentru a ajuta la calculele noastre geospațiale, trebuie să creăm acest proiect în Rails 2.3.5, deoarece pluginul nu este compatibil cu versiunea 3.0.
După ce vă conectați la contul dvs. de server / hosting (în cazul nostru folosim Heroku), tastați următoarele:
mkdir thump-server cd tamp-server / șine. elimina public / index.html
Instrucțiunile de mai sus vor crea un director și vor începe un nou proiect de șine în interiorul acestuia. Dacă aveți 3.0 instalat pe mașina dvs. de dezvoltare, este posibil să fie nevoie să instalați RVM și să creați o pereche separată pentru acest proiect. Cu toate acestea, face acest lucru în afara scopului tutorialului. Acum, să instalați pluginul geokit.
script / plugin instalare git: //github.com/andre/geokit-rails.git
Odată ce acest lucru este finalizat, trebuie să adăugăm bijuteria noastră la proiectul din interiorul Rails :: Initializer.run do | config | blocul fișierului nostru environment.rb:
config.gem "geokit"
Acum, că acest plugin a fost adăugat la proiect, trebuie să executați o comandă de rake pentru a vă asigura că toate pietrele necesare sunt instalate în sistemul nostru.
rake pietre: instalați
Geokit se bazează pe baza de date pentru a face niște calcule de distanță destul de sofisticate. Din acest motiv, baza de date SQLite implicită cu care vine un proiect cu șine nu va funcționa. Geokit cere ca vom folosi fie mysql, fie postgres db pentru a stoca datele noastre. Chiar dacă heroku folosește postgres în mod implicit, este mai frecvent ca mașinile de dezvoltare să aibă instalat mysql. Frumusețea utilizării Rails și ActiveRecord este că nu contează. Putem dezvolta aplicația noastră cu MySQL și va funcționa perfect cu postgres.
mysql -u rădăcină crează baza de date thumpserver;
Acum vom actualiza fișierul nostru database.yml pentru a îndrepta spre noua noastră bază de date de dezvoltare "thumpserver".
dezvoltare: adaptor: baza de date mysql: utilizator thumpserver: soclu rădăcină: /tmp/mysql.sock pool: 5 timeout: 5000
În cele din urmă procesul de creare a proiectului nostru este complet. Putem începe codarea logicii în interiorul nostru.
Rails are o metodă generatoare simplă care creează o resursă bazată pe REST pentru datele CRUD. Dacă ultima propoziție nu a avut nici un sens, vă sugerăm Google "resursele liniștite pentru șine" pentru a afla mai multe. În esență, cu o singură comandă, putem crea o tabelă de baze de date, un model, un controler și rute în interiorul proiectului.
./ script / genera tampon de resurse deviceid: șir lat: zecimal lng: mesaj zecimal: șir primit: boolean
Resursa noastra este numita thump, asa ca prin generarea acesteia in acest mod, va fi disponibila la url / thump odata ce serverul nostru ruleaza. Am specificat 5 câmpuri care urmează să fie create pentru tabela noastră de baze de date:
deviceid: UID-ul dispozitivului mobil
lat: latitudine oferită de serviciul de localizare
lng: longitudine
mesaj: mesajul care va fi transmis către utilizatorii care au răsturnat
primit: acesta este un boolean pentru a marca când a fost recepționat un mesaj, astfel încât acesta nu poate fi trimis din nou
Rails va crea "automagic" câmpurile pentru timbre numite create_at și updated_at. Vom folosi create_at mai târziu în exemplul nostru.
Când am generat resursa noastră, a fost creat un fișier de migrare a bazei de date pentru șine în folderul "db" al proiectului. Numele fișierului ar trebui să pară ca acesta: TIMESTAMP_create_thumps.rb
Trebuie să modificăm acest fișier pentru a ne asigura că locația noastră poate fi stocată cu suficient zecimale. Pentru a face acest lucru pur și simplu înlocuiți aceste două linii:
t.decimal: lat t.decimal: lng
Cu următoarele rânduri:
t.decimal: lat,: precision => 8,: scale => 8 t.decimal: lng,: precizie => 8,: scale => 8
Acest lucru va asigura faptul că câmpurile latitudine și longitudine pot conține cel mult 8 zecimale.
De asemenea, pentru a evita ca câmpul "primit" din baza noastră de date să fie NULL, trebuie să adăugăm o setare astfel încât valoarea sa să fie falsă în mod implicit. Din nou, putem face acest lucru prin înlocuirea acestei linii:
t.boolean: primit
Cu această linie:
t.boolean: primit,: default => false
Acum, că migrarea noastră este setată, putem rula comanda rake care va crea de fapt masa în interiorul bazei de date:
rake db: migrați
Pentru a lua datele de intrare pentru datele noastre, vom folosi acțiunea "create" în controlerul nostru. În plus, avem nevoie de o acțiune "de căutare" care va lua câțiva parametri și va căuta în baza de date pentru a se potrivi cu cele două dispozitive. Trebuie să modificăm rutele noastre în directorul de configurare pentru a răspunde la adresa URL / bate / căutare într-o solicitare GET. Putem face acest lucru prin înlocuirea acestei linii:
hărți. surse: thumps
Cu această linie
map.resources: thumps,: collection => : search =>: get
În continuare, să adăugăm următoarele linii în fișierul thump.rb din app / models.
acte_as_mappable validates_presence_of: lat,: lng,: deviceid
Prima linie face modelul nostru "cartografiat". Acest lucru ne oferă câteva metode suplimentare de interogare pentru a calcula distanța dintre două seturi de coordonate. Următoarea linie adaugă niște validări simple la modelul nostru de date, pentru a ne asigura că, atunci când primim un mesaj tumultuos, acesta conține câmpurile corespunzătoare.
În sfârșit, vom crea acțiunile noastre pentru crearea și căutarea datelor în controlorul nostru. Datorită frumuseții și simplității ActiveRecord, acțiunea noastră "create" este destul de simplă:
Define creaza Thump.create! (params [: thump]) render (: json => : succes => true)
În cazul în care validările noastre nu reușesc, vom returna un obiect json cu: success => false. În partea a III-a a tutorialului vom extinde aplicația noastră mobilă pentru a ține cont de acest lucru.
Căutarea noastră "acțiune" este puțin mai complexă, deoarece utilizează câțiva dintre ajutorul de interogare de la geokit:
Defineți căutarea pentru Thump = Thump.find (: prima,: origine => [params [: thump] [: lat], params [: thump] ?), paramurile [: bold] [: deviceid], false],: order => 'asc, created_at desc' succes => true,: message => thump.message) render rescue (: json => : succes => false) sfârșit
Să facem asta:
Thump = Thump.find (: prima,: origine => [params [: thump] [: lat], params [: thump] [: lng] , paramuri [: bate] [: deviceid], false],: order => 'distanta asc, created_at desc')
În esență, suntem în căutarea pentru meciul nostru "bătut" în baza de date. Un dispozitiv va trimite de-a lungul propriului latitudine și longitudine care va fi punctul nostru de origine. Condițiile noastre asigură faptul că nu găsim în mod accidental propriul dispozitiv prin excluderea propriului dispozitiv din setul de rezultate. De asemenea, dorim doar să căutăm în cazul în care câmpul "primit" este fals. Pentru a găsi cea mai apropiată potrivire atât la distanță, cât și la timp, vom ordona rezultatele noastre pe distanța dintre cele două puncte în ordinea ascendentă (adică cea mai apropiată) și timpul creat sau creat în ordine descrescătoare pentru a găsi cele mai recente. Este în mod evident un eveniment puțin probabil că vor exista "încurcări" conflictuale pentru aplicația noastră de test, dar acest tip de interogare ar putea rezista unei aplicații pentru mai mulți utilizatori dacă vrem să.
ridicați cu excepția cazului în care (thump) thump.update_attribute (: received, true) render (: json => : success => true,: message => thump.message)
Comanda de ridicare va afecta progresia codului nostru în blocul de salvare, care va reveni: succes => false dacă nu găsim o lovitură potrivită. Acest lucru ne va asigura că aplicația noastră mobilă va primi cel puțin ceva în caz de eroare. Dacă obiectul există, vom seta câmpul "primit" la adevărat pentru a ne asigura că acest mesaj nu va fi comparat într-o solicitare de date ulterioară. Instrucțiunea noastră de redare va returna un obiect JSON pe care îl va interpreta dispozitivul care recepționează "thump".
Pentru a testa acest lucru, putem rula o comandă în consola Rails pentru a crea un eșantion de înregistrare cu un punct de origine al orașului New York:
Thump.create (: deviceid => "B",: lat => 40.7141667,: lng => - 74.0063889,: message => "B")
Pentru a obține o potrivire "ticăloasă" sau o întoarcere reușită, putem începe mai întâi serverul nostru pe portul implicit 3000:
./ Script / server
Apoi apăsați următoarea adresă URL:
http: // localhost: 3000 / thumps / search thump [DeviceId] = A & thump [lat] = 40.7141667 & thump [lng] = -74.0063889
Dacă totul merge bine, browserul ar trebui să afișeze următoarele:
"Message": "B", "succes": true
Acest lucru simulează un dispozitiv numit "A" care primește un mesaj "tâmpit" de la dispozitivul B. Și acolo îl avem!
A fost acordat pentru partea a III-a din această serie, unde vom împinge aplicația serverului la Heroku și vom actualiza aplicația noastră mobilă pentru a comunica cu serverul.