Teilen von Daten mit Gesten Rails & Heroku-Setup

In Teil I dieser Serie haben Sie gesehen, wie wir im Corona-Framework eine einfache mobile App entwickelt haben, die auf eine "bump" -ähnliche Aktion ("Thump") reagiert, um eine Nachricht an ein anderes mobiles Gerät zu senden. Die Kommunikation zwischen den beiden mobilen Geräten findet zwischen einem zwischengeschalteten Serverprozess statt, der zwei "gestoßene" Geräte sowohl nach Zeitstempel als auch nach Entfernung abgleichen. In diesem Lernprogramm richten wir den zwischengeschalteten Serverprozess mit Ruby on Rails ein.

Beginnen wir mit der Erstellung unseres Projekts. Da wir das Geokit-Plugin verwenden, um unsere geografischen Berechnungen zu unterstützen, müssen wir dieses Projekt in Rails 2.3.5 erstellen, da das Plugin nicht 3.0-kompatibel ist.

Nachdem Sie sich bei Ihrem Server / Hosting-Konto angemeldet haben (in unserem Fall verwenden wir Heroku), geben Sie Folgendes ein:

 mkdir thump-server cd thump-server / schienen. Entfernen Sie public / index.html

Die obigen Anweisungen erstellen ein Verzeichnis und starten darin ein neues Schienenprojekt. Wenn Sie 3.0 auf Ihrem Entwicklungscomputer installiert haben, müssen Sie möglicherweise RVM installieren und ein separates Gemset für dieses Projekt erstellen. Dies ist jedoch außerhalb des Tutorials. Nun installieren wir das Geokit-Plugin.

 Skript / Plugin installieren git: //github.com/andre/geokit-rails.git

Sobald dies abgeschlossen ist, müssen wir unserem Projekt in der Rails :: Initializer.run do | config | unseren Edelstein hinzufügen Block unserer Datei environment.rb:

 config.gem "geokit"

Jetzt, da dieses Plugin dem Projekt hinzugefügt wurde, müssen wir einen Rake-Befehl ausführen, um sicherzustellen, dass alle benötigten Edelsteine ​​in unserem System installiert sind.

 Rechensteine: installieren

Geokit verlässt sich bei der Berechnung der Distanz auf die Datenbank. Aus diesem Grund funktioniert die SQLite-Standarddatenbank, mit der ein Schienenprojekt geliefert wird, nicht. Geokit erfordert, dass wir entweder eine mysql- oder eine postgres-Datenbank verwenden, um unsere Daten zu speichern. Obwohl Heroku standardmäßig postgres verwendet, ist es bei Entwicklungscomputern üblicher, dass mysql installiert ist. Das Schöne an Rails und ActiveRecord ist, dass es keine Rolle spielt. Wir können unsere App mit MySQL entwickeln und funktioniert nahtlos mit Postgres.

 mysql -u root erstellt Datenbank-Thumpserver;

Jetzt aktualisieren wir unsere database.yml-Datei, um auf unsere neu erstellte Entwicklungsdatenbank "thumpserver" zu verweisen..

 Entwicklung: Adapter: MySQL-Datenbank: Thumpserver Benutzer: Root-Socket: /tmp/mysql.sock Pool: 5 Timeout: 5000

Schließlich ist unser Projekterstellungsprozess abgeschlossen. Wir können damit beginnen, die Logik in unserem Thumpserver zu codieren.

Rails verfügt über eine einfache Generatormethode, mit der eine REST-basierte Ressource für Daten-CRUD erstellt wird. Wenn der letzte Satz keinen Sinn ergab, schlage ich vor, Sie suchen nach "Schienen für die Erholung", um mehr zu erfahren. Im Wesentlichen können Sie mit einem Befehl eine Datenbanktabelle, ein Modell, einen Controller und Routen innerhalb des Projekts erstellen.

 ./ script / generate resource thump deviceid: string lat: dezimal lng: dezimal nachricht: string erhalten: boolean

Unsere Ressource wird "thump" genannt. Wenn sie also auf diese Weise generiert wird, steht sie unter der URL / Thump zur Verfügung, sobald unser Server ausgeführt wird. Wir haben 5 Felder angegeben, die für unsere Datenbanktabelle erstellt werden sollen:

Geräte-ID: Die UID des mobilen Geräts
lat: vom Standortdienst bereitgestellte Breitengrad
lng: Längengrad
message: Die Nachricht, die an die Benutzer gesendet wird, die geklopft haben
erhalten: Dies ist ein boolescher Code, der markiert wird, sobald eine Nachricht empfangen wurde, sodass sie nicht erneut gesendet werden kann

Rails erstellt "automatisch" Zeitstempelfelder mit den Namen "create_at" und "updated_at". Wir werden später in unserem Beispiel created_at verwenden.

Als wir unsere Ressource erstellt haben, wurde im Ordner "db" des Projekts eine Migrationsdatei für die Schienen-Datenbank erstellt. Der Dateiname sollte ungefähr so ​​aussehen: TIMESTAMP_create_thumps.rb

Wir müssen diese Datei ändern, um sicherzustellen, dass unser Standort mit genügend Nachkommastellen gespeichert werden kann. Dazu einfach diese beiden Zeilen ersetzen:

 t.decimal: lat t.decimal: lng

Mit folgenden Zeilen:

 t.decimal: lat,: precision => 8,: scale => 8 t.decimal: lng,: precision => 8,: scale => 8

Dadurch wird sichergestellt, dass unsere Breiten- und Längenfelder maximal 8 Dezimalstellen enthalten können.

Um zu vermeiden, dass das "empfangene" Feld in unserer Datenbank NULL ist, müssen wir eine Einstellung hinzufügen, damit der Wert standardmäßig "false" ist. Wieder können wir dies tun, indem Sie diese Zeile ersetzen:

 t.boolean: erhalten

Mit dieser Zeile:

 t.boolean: erhalten,: default => false

Nun, da unsere Migration eingerichtet ist, können wir den Befehl rake ausführen, der die Tabelle tatsächlich in der Datenbank erstellt:

 rake db: migrieren

Um Eingaben für unsere Daten zu erhalten, verwenden wir die Aktion "Erstellen" in unserem Thump-Controller. Darüber hinaus benötigen wir eine "Suche" -Aktion, die einige Parameter übernimmt und die Datenbank durchsucht, um die beiden gestörten Geräte abzugleichen. Wir müssen unsere routes.rb im config-Verzeichnis ändern, um auf die URL / thump / search einer GET-Anfrage zu antworten. Wir können dies tun, indem Sie diese Zeile ersetzen:

 map.resources: Schläge

Mit dieser Zeile

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

Als nächstes fügen wir der thump.rb-Datei in app / models die folgenden Zeilen hinzu.

 Acts_as_mappable validates_presence_of: lat,: lng,: deviceid

Die erste Zeile macht unser Modell "mappable". Dies gibt uns einige zusätzliche Abfragemethoden, um den Abstand zwischen zwei Koordinatensätzen zu berechnen. Die nächste Zeile fügt unserem Thump-Datenmodell einige einfache Überprüfungen hinzu, um sicherzustellen, dass bei einer Thump-Nachricht die richtigen Felder enthalten sind.

Schließlich können wir unsere Aktionen zum Erstellen und Durchsuchen von Daten in unserer Steuerung erstellen. Dank der Schönheit und Einfachheit von ActiveRecord ist unsere Aktion "Erstellen" ziemlich einfach:

 def create Thump.create! (params [: thump]) render (: json => : success => true) retten rendern (: json => : success => false) ende

Falls unsere Validierungen fehlschlagen, geben wir ein json-Objekt mit folgendem Ergebnis zurück: success => false. In Teil III des Tutorials werden wir unsere mobile App erweitern, um dies zu berücksichtigen.

Unsere Suche "action" ist etwas komplexer, da einige der Abfragehilfen von geokit verwendet werden:

 def search thump = Thump.find (: first,: origin => [params [: thump] [: lat], params [: thump] [: lng]],: bedingungen => ["deviceid! =? UND erhalten = ? ", params [: thump] [: deviceid], false],: order => 'distance asc, created_at desc') erhöhen, es sei denn (thump) thump.update_attribute (: receive, true) render (: json => : success => true,: message => thump.message) rescue render (: json => : success => false) end

Brechen wir das mal auf:

 thump = Thump.find (: first,: origin => [params [: thump] [: lat], params [: thump] [: lng]],: bedingungen => ["deviceid! =? UND erhalten =?" , params [: thump] [: deviceid], false],: order => 'distance asc, created_at desc')

Im Wesentlichen fragen wir nach unserem "Thump" -Match in der Datenbank. Ein Gerät sendet entlang seines eigenen Breiten- und Längengrades, der unser Ausgangspunkt ist. Unsere Bedingungen stellen sicher, dass wir nicht versehentlich unser eigenes Gerät finden, indem wir unsere eigene Geräte-ID aus der Ergebnismenge ausschließen. Wir möchten auch nur Threads durchsuchen, bei denen das Feld "Received" falsch ist. Um sowohl in der Entfernung als auch in der Zeit die beste Übereinstimmung zu finden, ordnen wir unsere Ergebnisse nach der Entfernung zwischen den 2 Punkten in aufsteigender Reihenfolge (d. H. Am nächsten) und der erstellten oder erstellten Zeit in absteigender Reihenfolge, um die neuesten Ergebnisse zu finden. Es ist offensichtlich ein unwahrscheinlicher Fall, dass es zu widersprüchlichen "Schlägen" für unsere Test-App kommt, aber diese Art von Abfrage könnte einer Mehrbenutzeranwendung standhalten, wenn wir es wollten.

 erhöhen, es sei denn (thump) thump.update_attribute (: erhalten, true), render (: json => : success => true,: message => thump.message)

Der Erhöhungsbefehl wird unseren Codeablauf in den Rettungsblock stoßen, der Folgendes zurückgibt: success => false, wenn wir keinen passenden Schlag finden. Dadurch wird sichergestellt, dass unsere mobile App im Fehlerfall zumindest etwas zurückbekommt. Wenn das Objekt existiert, setzen wir das Feld "receive" auf true, um sicherzustellen, dass diese Nachricht in einer nachfolgenden Datenanforderung nicht übereinstimmt. Unsere Render-Anweisung gibt ein JSON-Objekt zurück, das das Gerät, das den "Thump" empfängt, interpretiert.

Um dies zu testen, können Sie in der Rails-Konsole einen Befehl ausführen, um einen Beispieldatensatz mit einem Ursprungspunkt von New York City zu erstellen:

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

Um ein "Thump" -Match oder eine erfolgreiche Rückkehr zu erhalten, können wir unseren Server zuerst am Standardport 3000 starten:

 ./ script / server

Und dann die folgende URL anklicken:

http: // localhost: 3000 / thumps / search? thump [deviceid] = A & thump [lat] = 40.7141667 & thump [lng] = -74.0063889

Wenn alles gut geht, sollte der Browser Folgendes anzeigen:

 "message": "B", "success": true

Dies simuliert ein Gerät mit der Bezeichnung "A", das eine "Schlag" -Nachricht von Gerät B empfängt. Dort haben wir es!

Nächstes Mal?

Wir haben uns auf Teil III dieser Serie eingestellt, in dem wir die Server-App auf Heroku übertragen und unsere mobile App für die Kommunikation mit dem Server aufrüsten werden.