12/08/2018, 17:11
Create a location model that can store the address and the corresponding latitude and longitude with gem "geocoder"
Geocoder Geocoder là một giải pháp mã hóa địa lý hoàn chỉnh cho Ruby. Nó cho phép chuyển đổi tên các địa điểm thành tọa độ địa lý và ngược lại, thậm chí có thể chuyển đổi địa chỉ IP thành các địa chỉ đường phố. Nó cũng cho phép bạn tìm kiếm những địa điểm gần đó với khoảng cách và chỉ dẫn và rất ...
Geocoder
Geocoder là một giải pháp mã hóa địa lý hoàn chỉnh cho Ruby. Nó cho phép chuyển đổi tên các địa điểm thành tọa độ địa lý và ngược lại, thậm chí có thể chuyển đổi địa chỉ IP thành các địa chỉ đường phố. Nó cũng cho phép bạn tìm kiếm những địa điểm gần đó với khoảng cách và chỉ dẫn và rất nhiều tính năng hữu ích khác.
Cài đặt
- Thêm vào Gemfile:
gem "geocoder"
- Sau đó bunder
- Tạo model location
rails g scaffold Location address:string latitude:float longitude:float rails db:migrate
- Controller
# app/controllers/locations_controller.rb class LocationsController < ApplicationController def index @search = case when params[:ip].present? Geocoder.search(params[:ip]).first&.data&.slice("latitude", "longitude")&.symbolize_keys when params[:address].present? location = Geocoder.coordinates(params[:address]) {latitude: location[0], longitude: location[1]} end @locations = Location.all if @search.blank? @location = Location.new end def create @location = Location.new(allowed_params) if @location.save redirect_to locations_path, notice: "Successfully created location." else render :new end end def edit @location = Location.find(params[:id]) end def update @location = Location.find params[:id] if @location.update_attributes allowed_params redirect_to locations_path, notice: "Successfully updated location." else render :edit end end def destroy @location = Location.find(params[:id]) @location.destroy redirect_to locations_path, notice: "Successfully destroyed location." end private def allowed_params params.require(:location).permit :id, :address, :latitude, :longitude end end
- Views
<div class="row"> <div class="col-md-5"> <%= form_tag locations_path, method: :get do %> <p> <%= text_field_tag :address, params[:address], placeholder: "Address" %> <%= text_field_tag :ip, params[:ip], placeholder: "Ip" %> <%= submit_tag "Search"%> </p> <% end %> <h1>Locations</h1> <table> <thead> <tr> <th>Address</th> <th>Latitude</th> <th>Longitude</th> <th colspan="3"></th> </tr> </thead> <tbody> <% @locations&.each do |location| %> <tr> <td><%= location.address %></td> <td><%= location.latitude %></td> <td><%= location.longitude %></td> <td><%= link_to 'Show', location %></td> <td><%= link_to 'Edit', edit_location_path(location) %></td> <td><%= link_to 'Destroy', location, method: :delete, data: { confirm: 'Are you sure?' } %></td> </tr> <% end %> </tbody> </table> <br> <%= form_for @location do |f| %> <p> <%= f.label :address %><br /> <%= f.text_field :address %> </p> <p> <%= f.label :latitude %><br /> <%= f.text_field :latitude %> </p> <p> <%= f.label :longitude %><br /> <%= f.text_field :longitude %> </p> <p><%= f.submit %></p> <% end %> </div> <div class="col-md-7"> <%= image_tag "http://maps.google.com/maps/api/staticmap?size=2000x2000&sensor=false&zoom=16 #{markers @locations if @locations.present?}#{search_location @search if @search.present?}" %> </div> </div>
- Routes
# config/routes.rb Rails.application.routes.draw do resources :locations end
- Helpers
#app/helpers/application_helper.rb module ApplicationHelper def markers locations locations.inject(""){|str, location| str += "&markers=#{location.latitude}%2C#{location.longitude}"} end def search_location location "&markers=#{location[:latitude]}%2C#{location[:longitude]}" end end
Kết quả
- Tìm kiếm theo địa chỉ
- Tìm kiếm theo ip
- Thêm vị trí
- Danh sách tất cả vị trí