DEV Community

Cover image for How to use the Browser Geolocation API with StimulusJS and Rails
Yaroslav Shmarov
Yaroslav Shmarov

Posted on • Originally published at blog.corsego.com on

How to use the Browser Geolocation API with StimulusJS and Rails

Task: get users coordinates from browser, redirect to page with coordinates in params:

geolocation-api-search.gif

To request users’ location, we will use Web/API/Geolocation/getCurrentPosition with StimulusJS.

Create stimulus controller:

rails g stimulus geolocation 
Enter fullscreen mode Exit fullscreen mode
// app/javascript/controllers/geolocation_controller.js import { Controller } from "@hotwired/stimulus" const options = { enableHighAccuracy: true, maximumAge: 0 }; // Connects to data-controller="geolocation" export default class extends Controller { static values = { url: String } search() { navigator.geolocation.getCurrentPosition(this.success.bind(this), this.error, options); } success(pos) { const crd = pos.coords; // redirect with coordinates in params location.assign(`/locations/?place=${crd.latitude},${crd.longitude}`) } error(err) { console.warn(`ERROR(${err.code}): ${err.message}`); } } 
Enter fullscreen mode Exit fullscreen mode

Finally, a button to get location:

<div data-controller="geolocation"> <button data-action="geolocation#search">search near me</button> </div> 
Enter fullscreen mode Exit fullscreen mode

💡 Interestingly, if you use this.success instead of this.success.bind(this), stimulus targets will not work within the success function.

Get address from coordinates

Get address (city, street...) based on coordinates using geocoder , and search near the address:

# app/javascript/controllers/geolocation_controller.js - location.assign(`/locations/?place=${crd.latitude},${crd.longitude}`) + location.assign(`/locations/?coordinates=${crd.latitude},${crd.longitude}`) 
Enter fullscreen mode Exit fullscreen mode
# app/controllers/locations_controller.rb def index + if params[:coordinates].present? + place = Geocoder.search(params[:coordinates]) + params[:place] = place.first.address + end   if params[:place].present? @locations = Location.near(params[:place], params[:distance] || 10, order: :distance) else @locations = Location.all end end 
Enter fullscreen mode Exit fullscreen mode

That’s it! Now you can get Geolocation with Javascript and use it within a Rails app!

Top comments (0)