2008-12-01 6 views
0

У меня есть тег div в представлении, который я хотел бы обновить графиком, который я генерирую через Gruff.Как обновить содержимое заполнителя сгенерированным изображением в Rails?

У меня есть следующие действия контроллера, который делает это в конце

send_data g.to_blob, :disposition=>'inline', :type=>'image/png', :filename=>'top_n.pdf' 

Теперь, если я прямо ссылаться на это действие, я могу увидеть график. (Подробнее here if reqd.)

Если я добавлю link_to_remote_tag, который вызывает вышеуказанное действие через AJAX, проходящий через определенный вход, генерирует этот график и пытается обновить тег div заполнителя ... Я вижу тарабарщину.

Я думаю, что могу написать график в png-файле с помощью g.write(filename.png) как вставлять граф в тег div в представлении во время выполнения?

ответ

1

В вашем link_to_remote тег просто установить: полный к чему-то вроде этого:

:complete => "updateImg(id_of_div, request.responseText)" 

И написать функцию JS:

function updateImg(id, img) 
{ 
    $(id).innerHTML = '<img src="' + img + '" />'; 
} 

Где id_of_div является идентификатор DIV, когда вы хотите показать изображение.

Request.responseText var исходит из запроса вызова AJAX, я имею в виду, когда ваш код записывает файл png с графиком, завершите метод, возвращающий путь к этому новому png (render: text => path_to_new_image) ; затем используйте эту переменную запроса в: complete.

+0

Обновлено мое сообщение в блоге с решением, основанным на этом сообщении. Благодаря ARemesal. – Gishu 2008-12-01 19:29:53

+0

Добро пожаловать;) – ARemesal 2008-12-01 21:46:16

0

Вы можете использовать обычный тег img, чтобы вызвать действие контроллера, которое возвращает сгенерированный png. Если настроить контроллер использовать respond_to что-то вроде этого:

def graph 
    # get the relevant data for 'g' here 
    respond_to do |format| 
     format.html #uses the default view if relevant (good for debugging) 
     format.png do 
      send_data g.to_blob, 
       :disposition=>'inline', 
       :type=>'image/png', 
       :filename=>'top_n.pdf' 
     end 
    end 
end 

Вы даже нормальная ищет URL для генератора, как это:

<img src="controller/graph.png" alt="Something"/> 

Если есть шанс поколение изображения может fail: вы можете сохранить резервный образ на сервере и прочитать этот файл и вернуть его.

Если поколение довольно тяжелое и вряд ли изменится все время, когда вы простужаете весь полученный результирующий файл, и получите это вместо этого, если вы определите, что данные не изменились. Вы можете использовать метод ARemesal, предлагающий отложить добавление ссылки на изображение до тех пор, пока изображение не будет сгенерировано, а затем не будет напрямую связано с кэшированным файлом. (Это зависит от вашего конкретного случая, что лучше)