Рендеринг тегов Rails в Javascript - PullRequest
1 голос
/ 30 января 2011

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

Плагин принимает обратный вызов 'onLoad', который выполняется после завершения загрузки.Чтобы обратный вызов работал, все, что нужно, это функция Javascript, которая, знаете ли, делает все, что будет дальше.Хорошо.То, что я хотел бы для обратного вызова, чтобы загрузить часть, которая заменила бы форму загрузки отображением изображения.Итак, вот как я определяю обратный вызов:

onLoad: function (evt, files, index, xhr, handler) {  
    (document).ready(function($) {  
        $('.container').html('<%= escape_javascript(render :partial => "pictures/picture_editor", :locals => { :picture => @picture }, :layout => false) %>')});  
}

Итак, что я не хочу, конечно, для этого тега 'render' для отображения дообратный вызов, но это именно то, что происходит.Страница загружается, и сразу же я получаю сообщение об ошибке, потому что Rails пытается отобразить этот тег, не дожидаясь выполнения Javascript или чего-либо еще - Rails видит тег в представлении, взрыв, хочет его отобразить.Я пытался найти ответ и чувствую, что мне должно не хватает чего-то болезненно очевидного - но как мне загрузить частичное из обратного вызова jQuery, если я не могу указать тег отображения в представлении?Чего мне не хватает?

Прошу прощения, если ответ очень очевиден.

1 Ответ

1 голос
/ 30 января 2011

Частичное не может быть визуализировано автономно (например, в ответе ajax). Один способ, который, я думаю, исправит это, предполагая, что вам все еще нужно, чтобы частичное являлось частичным (то есть вы должны отобразить его как часть других страниц), это:

  1. Создайте действие PicturesController#picture_editor, которое просто визуализирует партиал без макета.
  2. В обработчике событий JavaScript загрузите это действие в div с помощью функции jQuery 'load'.

Примерно так в PicturesController:

def picture_editor
  @picture = Picture.find(params[:id])
  render :partial => 'picture_editor', :picture => @picture :layout => false
end

и это в JavaScript (в файле .html.erb или .js.erb, поэтому он будет обрабатываться Ruby; не в raw .js):

$('.container').load('<%= url_for(:controller => 'Pictures', :action => 'picture_editor' %>')});  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...