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 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í

    Tài liệu tham khảo


Hãy đăng nhập để trả lời
 

Có vẻ như bạn đã mất kết nối tới LaptrinhX, vui lòng đợi một lúc để chúng tôi thử kết nối lại.