Попытка заполнить gmaps4rails несколькими строками json на одной странице

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

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

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

@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

person keade    schedule 01.12.2011    source источник
comment
Что вы подразумеваете под Контроллер1 Контроллер2? Вы не должны вызывать .all на контроллерах. Вы должны делать это на моделях. Можете ли вы дать нам некоторую информацию о том, как построены ваши модели?   -  person Sean Hill    schedule 05.12.2011
comment
Шон, извините за это - я хотел разместить информацию с разных контроллеров, т.е. магазины и рестораны, в 1 карту на главной странице. Ответ ниже сработал, но мне интересно перенести информацию в модель с контроллера. На данный момент модели почти базовые, со встроенными в модель gmappable, _address и _infowindow и поиском.   -  person keade    schedule 05.12.2011


Ответы (2)


Попробуй это

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 для управления маркерами на основе класса.

Как сказал @Sean Hill, вам не следует вызывать .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  
person Joey    schedule 05.12.2011
comment
Чувак. Босс! Работал как шарм для меня. Итак, создав «держатель» и присвоив вложенные контроллеры, вызов этого «держателя» отобразит все, что находится под ним? Хорошо знать! Спасибо, Джоуи. - person keade; 05.12.2011
comment
Я думал, что это работает для отображения каждого местоположения, но мне нужно будет различать местоположения, то есть рестораны и магазины. Эта модель позволяет массово отображать только все включенные ссылки, верно? - person keade; 06.12.2011
comment
У меня есть канал json, который показывает lng, lat и class, но как мне вызвать класс для отображения определенного маркера и ссылки на информацию об этой странице? Спасибо! - person keade; 13.12.2011
comment
Вы выходите далеко за рамки своего первоначального вопроса. Приведенный выше json позволит вам определить, какой маркер принадлежит к какому классу в браузере с помощью js. С картой на странице попробуйте Gmaps.map.markers[0] в веб-консоли, чтобы увидеть идентифицированный класс. Оттуда вы можете написать что-то похожее на http://stackoverflow.com/questions/6035984/adding-an-event-listener-to-the-markers-using-gmaps4rails в зависимости от ваших потребностей. Вам также следует ознакомиться с дополнительными методами, представленными здесь https://github.com/apneadiving/Google-Maps-for-Rails/wiki/Markers. Я также обновил свой ответ. - person Joey; 14.12.2011

Я заполнил карту своими исходными данными о фестивалях, а затем добавил к ней аттракционы с помощью 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

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

person Blaine Hatab    schedule 14.03.2013