アクションを実行するremote: true
Rails 3 app controller に呼び出しがあります。ものすごく単純。HotelsController
show_map
<%= link_to "Map", show_hotel_map_path(@hotel.id), remote: true %>
<div id="hotel_map"></div>
show_hotel_map
アクションはかなり基本的です
def show_hotel_map
@hotel = Hotel.find(params[:id])
respond_to do |format|
format.html
format.js
end
end
show_hotel_map.js.erb
map
レンダリングされた Google マップ マップを使用して、JQuery-UI ダイアログ内でパーシャルをレンダリングするためのものです。
$("#hotel_map").dialog({
autoOpen: true,
height: 'auto',
width: 'auto',
modal: true,
closeOnEscape: true,
position: 'center',
resizable: false,
title: "Map",
open: function(){
$("#hotel_map").html("<%= escape_javascript(render partial: "map") %>")
}
});
_map.html.erb
partial はrender_map
ヘルパーを実行するだけで何もしません
<%= render_map %>
render_map
Gmaps4Rails
ヘルパーは、 gemを使用してマップをレンダリングすることですべてのことを行います
module HotelsHelper
def render_map
if @hotel.address.latitude && @hotel.address.longitude
map = @hotel.address.to_gmaps4rails
else
geo = Gmaps4rails.geocode("#{@hotel.continent.name}, #{@hotel.country.name}, #{@hotel.location.name}")[0]
map = [{lat: geo[:lat], lng: geo[:lng]}].to_json
end
gmaps(:markers => { :data => map, :options => { :draggable => true } })
end
end
問題は、Gmaps4Rails
gem が適切な Google マップの処理のためにいくつかの JavaScript をレンダリングすることですが、明らかにこの JavaScript はビューescape_javascript
からの呼び出し によって切り詰められていshow_map.js.erb
ます。リンクをクリックする"Map"
と、JQuery-UI ダイアログがレンダリングされますが、Javascript が実行されていないため、ペイロードはありません。helper はそれ自体で完全に機能するため、 gemrender_map
では問題ないと思います。Gmaps4Rails
そのJavaScriptを実行できるようにするための回避策はありますか? いくつかのハックを思いつくことができますが、もっと Rail っぽい方法があるのではないでしょうか?
ありがとうございました!