Попытка заполнить gmaps4rails несколькими строками json на одной странице - PullRequest
0 голосов
/ 01 декабря 2011

Я надеюсь, что спрашиваю правильно, поэтому, пожалуйста, дайте мне знать, если я далеко.

Проблема заключается в попытке создать домашнюю страницу, которая рисует с нескольких контроллеров, для отображения ближайших местоположений с нескольких контроллеров, т.е.еда, бизнес, т. д.

Прямо сейчас на страницах отдельных списков есть карты, составленные из их соответствующих

@json = Controller.all.to_gmaps4rails

Как мне сделать что-то вроде:

@json = Controller1 Controller2 .all.to_gmaps4rails

Надеюсь, это не нубский вопроси у меня просто плохой день.Спасибо, ребята!

edit 12.5.2011 @seanhill - это одна из моделей, остальные разделы очень близки к этому формату.Во-первых, я даже не был уверен, требует ли моя домашняя страница своей собственной модели, так как она вообще не взаимодействует с базой данных, а получает больше данных от контроллеров, которые выполняют эту работу.Спасибо за ответ, Шон!

class Dining < ActiveRecord::Base
validates_uniqueness_of :name, :message => "already exists"

attr_accessible :name, :address, :cuisine, :latitude, :longitude, :about, :facebook, :twitter, :phone, :website
geocoded_by :address
after_validation :geocode, :if => :address_changed?

acts_as_gmappable :process_geocoding => false

def gmaps4rails_address
    "#{self.address}"
end

def gmaps4rails_infowindow
    "<h3>#{self.name}</h3><br /><h5>#{self.cuisine}</h5>"
end

def self.search(search)
    if search
        where('name LIKE ?', "%#{search}%")
    else
        scoped
    end
end

end

Ответы [ 3 ]

0 голосов
/ 04 января 2013
@json1 = something.to_gmaps4rails
@json2 = something.to_gmaps4rails

@json = (JSON.parse(@json1) + JSON.parse(@json2)).to_json
0 голосов
/ 14 марта 2013

Я заполнил карту своими начальными данными фестивалей, а затем добавил к ней поездки с помощью javascript с этим кодом,

<% content_for :scripts do %>
  <script type="text/javascript">

    Gmaps.map.callback = function() {

      $.getJSON('/rides_gmap', function(data){
          Gmaps.map.addMarkers(data);
        });

      }
  </script>
<%end%>

В контроллере аттракционов у меня было это

def rides_gmap
    @rides = Ride.all
    @json = @rides.to_gmaps4rails do |ride, marker|
      marker.infowindow render_to_string(:partial => "/rides/infowindow", :locals => { :ride => ride})
      marker.picture({
                'picture' => view_context.image_path("orange-dot.png"),
                'width'   => 20,
                'height'  => 20
               })
      marker.title "#{ride.address}"
      marker.json({:ride_id => ride.id, :ride_festivaltype => ride.festival.festivaltype 
    end
    respond_with @json
  end

Надеюсь, это поможет.

0 голосов
/ 05 декабря 2011

Попробуйте это

holder = Controller1.all
holder << Controller2.all
@json = holder.flatten.map{|h| {lng: h.longitude, lat: h.latitude, class: h.class.to_s}}.to_json

Обязательно измените longitude и latitude на основе имен столбцов и используйте js для манипуляции с маркерами на основе класса.

Как @Шон Хилл сказал, что вы не должны звонить .all на контроллеры, но я думаю, у вас есть небольшое недопонимание того, как все работает.Предполагая, что у вас есть Model с именем Dining и еще один с именем Shop, когда вы звоните Dining.all или Shop.all внутри class DiningsController < ApplicationController, вы звоните .all на Dining Model или Shop Modelне на DiningsController.

Информация, которую вы отображаете через контроллер, ограничена только методами, которые вы вызываете в нем, хотя рекомендуется, чтобы основной фокус отображаемой информации был связан с соответствующим контроллером.

Итакто, что вы действительно пытаетесь сделать, это получить записи из нескольких моделей и сгруппировать их, чтобы отобразить их на одной карте.

С учетом сказанного, ответ должен выглядеть примерно так

holder = Dining.all # Takes all Dining records returned as an array and sets them to holder variable 
holder << Shop.all # Pushes the Shop records array into the holder with the dining records
holder.flatten!# Next we flatten the array so we only have a single array. 

# Then we use the map method to run the given code one time for each instance 
# in the holder array to extract the info we need. The results for every instance 
# in holder are returned in an array which we then convert to_json.
@json = holder.map{|h| {lng: h.longitude, lat: h.latitude, class: h.class.to_s}}.to_json  
...