Deling av data med bevegelser Rails & Heroku Setup

I del I av denne serien så du hvordan vi laget en enkel mobilapp i Corona-rammeverket som reagerer på en "bump" -aktivitet (kalt en "thump") for å sende en melding til en annen mobilenhet. Kommunikasjonen mellom de to mobilenhetene skjer mellom en mellomliggende serverprosess som matcher to "thumped" enheter av både tidsstempel og avstand. I denne opplæringen vil vi sette opp den mellomliggende serverprosessen med Ruby on Rails.

La oss starte med å lage vårt prosjekt. Siden vi skal bruke geokit-pluginet for å hjelpe til med våre geospatiale beregninger, må vi opprette dette prosjektet i Rails 2.3.5, fordi plugin ikke er 3,0 kompatibel.

Etter å ha logget inn på server / hosting-kontoen din (i vårt tilfelle bruker vi Heroku), skriv inn følgende:

 mkdir thump-server cd thump-server / skinner. fjern offentlig / index.html

Ovennevnte uttalelser vil opprette en katalog og starte et nytt railsprosjekt inne i det. Hvis du har 3,0 installert på utviklingsmaskinen din, kan det hende du må installere RVM og opprette en egen gemset for dette prosjektet. Dette gjøres imidlertid utenfor handlingenes omfang. La oss nå installere Geokit-pluginet.

 script / plugin installere git: //github.com/andre/geokit-rails.git

Når dette er fullført, må vi legge til vår perle til prosjektet inne i Rails :: Initializer.run do | config | blokk av vår environment.rb-fil:

 config.gem "geokit"

Nå som dette pluginet er lagt til i prosjektet, må vi kjøre en rake-kommando for å sikre at alle nødvendige perler er installert i vårt system.

 rake gems: installere

Geokit stoler på databasen for å gjøre noen ganske sofistikerte avstandsberegninger. På grunn av dette vil standard SQLite-databasen som et skinnerprosjekt kommer med, ikke fungere. Geokit krever at vi bruker enten en mysql eller postgres db for å lagre dataene våre. Selv om heroku bruker postgres som standard, er det mer vanlig at utviklingsmaskiner har mysql installert. Skjønnheten ved å bruke Rails og ActiveRecord er at det ikke betyr noe. Vi kan utvikle vår app med MySQL, og det vil fungere sømløst med postgres.

 mysql -u root opprette database thumpserver;

Nå oppdaterer vi vår database.yml-fil for å peke på vår nyopprettede utviklingsdatabase "thumpserver".

 utvikling: adapter: mysql database: thumpserver bruker: root socket: /tmp/mysql.sock pool: 5 timeout: 5000

Endelig er prosjektprosessprosessen fullført. Vi kan begynne å kode logikken i vår thumpserver.

Rails har en enkel generator metode som lager en REST basert ressurs for data CRUD. Hvis den siste setningen ikke hadde noen mening, foreslår jeg at du google "rails restful resources" for å finne ut mer. I hovedsak med en kommando kan vi lage en database tabell, modell, kontroller og ruter inne i prosjektet.

 ./ skript / generer ressurs dump deviceid: streng lat: desimal lng: desimalmelding: streng mottatt: boolsk

Vår ressurs kalles thump, så ved å generere den på denne måten, vil den være tilgjengelig på webadressen når serveren vår kjører. Vi angav 5 felt som skal opprettes for databasetabellen:

deviceid: mobilenhetens UID
lat: breddegrad gitt av stedstjenesten
Lng: lengdegrad
melding: meldingen som vil bli overført til brukerne som har dumpet
mottatt: dette er en boolsk til å markere en gang en melding er mottatt, slik at den ikke kan sendes igjen

Rails vil "automagisk" lage tidsstempelfelt kalt created_at og updated_at. Vi vil bruke created_at senere i vårt eksempel.

Da vi genererte vår ressurs, ble det opprettet en ranger databasemigreringsfil i prosjektmappen "db". Filnavnet ser ut til å være noe slikt: TIMESTAMP_create_thumps.rb

Vi må endre denne filen for å sikre at plasseringen vår kan lagres med nok desimaler. For å gjøre dette bare erstatte disse to linjene:

 t.decimal: lat t.decimal: lng

Med følgende linjer:

 t.decimal: lat,: presisjon => 8,: skala => 8 t.decimal: lng,: presisjon => 8,: skala => 8

Dette vil sikre at våre breddegrad og lengdegradfelt kan inneholde maksimalt 8 desimaler.

For å unngå at "mottatt" -feltet i databasen vår er NULL, må vi legge til en innstilling slik at verdien er falsk som standard. Igjen kan vi gjøre dette ved å erstatte denne linjen:

 t.boolean: mottatt

Med denne linjen:

 t.boolean: mottatt,: default => false

Nå som vår migrering er satt opp, kan vi kjøre rake-kommandoen som faktisk skal lage tabellen inne i databasen:

 rake db: migrere

For å ta innspill for dataene våre, bruker vi "opprett" -aksjonen i vår thump controller. I tillegg til dette, trenger vi en "søk" -handling som tar noen parametere og søker gjennom databasen for å matche de to dumpede enhetene. Vi må endre våre routes.rb i config-katalogen for å svare på URL / thump / søk på en GET-forespørsel. Vi kan gjøre dette ved å erstatte denne linjen:

 map.resources: thumps

Med denne linjen

 map.resources: thumps,: collection => : search =>: get

Neste opp, la oss legge til følgende linjer i vår thump.rb-fil inne i app / modeller.

 acts_as_mappable validates_presence_of: lat,: lng,: deviceid

Den første linjen gjør vår modell "mappable". Dette gir oss noen ekstra spørringsmetoder for å beregne avstanden mellom to koordinatsett. Den neste linjen legger til noen enkle valideringer i vår dumpedatamodell for å sikre at når vi får en dunmelding, inneholder den de riktige feltene.

Endelig kommer vi til å skape våre handlinger for å lage og søke data i vår kontroller. Takket være skjønnheten og enkelheten til ActiveRecord er vår "opprett" -handling ganske enkel:

 def lage Thump.create! (params [: thump]) render (: json => : success => true) redning gjengivelse (: json => : success => false)

I tilfelle at våre valideringer feiler, returnerer vi et json objekt med: suksess => false. I del III av opplæringen vil vi utvide vår mobilapp for å ta hensyn til dette.

Vårt søk "action" er litt mer komplekst fordi det bruker noen av spørringshjelpene fra geokit:

 def: søk =] [: lmp]]:: conditions => ["deviceid! =? OG mottatt = ? ", params [: thump] [: deviceid], false],: order => 'avstand asc, created_at desc') øke med mindre (thump) thump.update_attribute (: received, true) render suksess => true,: message => thump.message) redning gjengivelse (: json => : success => false) slutten

La oss bryte dette ned:

 thump = Thump.find (: first,: origin => [params [: thump] [: lat], params [: thump] [: lng]],: conditions => ["deviceid! =" og mottatt =? " , params [: thump] [: deviceid], false],: order => 'avstand asc, created_at desc')

I hovedsak spør vi om vår "thump" -kamp i databasen. En enhet vil sende sin egen breddegrad og lengdegrad som vil være vårt utgangspunkt. Våre forhold sikrer at vi ikke ved et uhell finner vår egen enhet ved å ekskludere vår egen deviceid fra resultatsettet. Vi vil også bare søke etter thumps der "mottatt" feltet er feil. For å finne nærmeste match i både avstand og tid, bestiller vi resultatene våre med avstand mellom de to punktene i stigende rekkefølge (dvs. nærmest) og tidskrepet eller opprettet_at i synkende rekkefølge for å finne de nyeste. Det er åpenbart en usannsynlig hendelse at det vil være noen motstridende "thumps" for vår testapp, men denne typen spørring kan holde opp til et flerbrukerprogram hvis vi ønsker det.

 høyne med mindre (thump) thump.update_attribute (: mottatt, sant) gjengi (: json => : success => true,: message => thump.message)

Heve kommandoen vil støte vår kodeprogresjon inn i redningsblokken som kommer tilbake: suksess => falsk hvis vi ikke finner en matchende bunke. Dette vil sikre at mobilappen vår i hvert fall mottar noe i tilfelle en feil. Hvis objektet eksisterer, vil vi sette feltet "mottatt" til sant for å sikre at denne meldingen ikke blir matchet i en påfølgende dataforespørsel. Vår gjengivelse vil returnere et JSON objekt som enheten som mottar "thump" vil tolke.

For å teste dette kan vi kjøre en kommando i Rails-konsollen for å lage en prøveoppføring med et opprinnelsessted i New York City:

 Thump.create (: deviceid => "B",: lat => 40.7141667,: lng => - 74.0063889,: melding => "B")

For å få en "thump" -kamp, ​​eller en vellykket retur, kan vi først starte serveren vår på standard port 3000:

 ./ Script / server

Og deretter slå følgende URL:

http: // localhost: 3000 / dunk / søk dunk [DeviceID] = A & dunk [lat] = 40,7141667 & dunk [lng] = -74,0063889

Hvis alt går bra, bør nettleseren vise følgende:

  "Message": "B", "suksess": true

Dette simulerer en enhet som heter "A" og mottar en "thump" melding fra enhet B. Og der har vi det!

Neste gang?

Ble stilt inn for del III i denne serien, der vi skal presse serverapplikasjonen til Heroku og oppgradere mobilappen vår for å kommunisere med serveren.