Рельсы: Контроллер AJAX JS не стреляет - PullRequest
0 голосов
/ 16 марта 2010

У меня проблема с одной из функций AJAX моего контроллера. Вот что у меня есть:

class PhotosController < ApplicationController
  # ...
  def create
    @photo = Photo.new(params[:photo])
    @photo.image_content_type = MIME::Types.type_for(@photo.image_file_name).to_s
    @photo.image_width = Paperclip::Geometry.from_file(params[:photo][:image]).width.to_i
    @photo.image_height = Paperclip::Geometry.from_file(params[:photo][:image]).height.to_i
    @photo.save!

    respond_to do |format|
      format.js
    end
  end
  # ...
end

Это вызывается через POST запрос, отправленный этим кодом:

$(function() {
  // add photos link
  $('a.add-photos-link').colorbox({
    overlayClose: false,
    onComplete: function() { wire_add_photo_modal(); }
  });

  function wire_add_photo_modal() {
    <% session_key = ActionController::Base.session_options[:key] %>
    $('#upload_photo').uploadify({
      uploader: '/swf/uploadify.swf',
      script: '/photos',
      cancelImg: '/images/buttons/cancel.png',
      buttonText: 'Upload Photo(s)',
      auto: true,
      queueID: 'queue',
      fileDataName: 'photo[image]',
      scriptData: {
        '<%= session_key %>': '<%= u cookies[session_key] %>',
        commit: 'Adding Photo',
        controller: 'photos',
        action: 'create',
        '_method': 'post',
        'photo[gallery_id]': $('#gallery_id').val(),
        'photo[user_id]': $('#user_id').val(),
        authenticity_token: encodeURIComponent('<%= u form_authenticity_token if protect_against_forgery? %>')
      },
      multi: true
    });
  }
});

Наконец, у меня есть код ответа в app/views/photos/create.js.erb:

alert('photo added!');

Мой файл журнала показывает, что запрос был успешным (фотография была успешно загружена), и даже говорит, что он выполнил действие create, но я так и не получил оповещение. Мой браузер не показывает ошибок JavaScript.

Вот журнал ПОСЛЕ запроса из вышеуказанного POST запрос отправлен:

Processing PhotosController#create (for 127.0.0.1 at 2010-03-16 14:35:33) [POST]
Parameters: {"Filename"=>"tumblr_kx74k06IuI1qzt6cxo1_400.jpg", "photo"=>{"user_id"=>"1", "image"=>#<File:/tmp/RackMultipart20100316-54303-7r2npu-0>}, "commit"=>"Adding Photo", "_edited_session"=>"edited", "folder"=>"/kakagiloon/", "authenticity_token"=>"edited", "action"=>"create", "_method"=>"post", "Upload"=>"Submit Query", "controller"=>"photos"}
[paperclip] Saving attachments.
[paperclip] saving /public/images/assets/kakagiloon/thumbnail/tumblr_kx74k06IuI1qzt6cxo1_400.jpg
[paperclip] saving /public/images/assets/kakagiloon/profile/tumblr_kx74k06IuI1qzt6cxo1_400.jpg
[paperclip] saving /public/images/assets/kakagiloon/original/tumblr_kx74k06IuI1qzt6cxo1_400.jpg
Rendering photos/create
Completed in 248ms (View: 1, DB: 6) | 200 OK [http://edited.local/photos]

ПРИМЕЧАНИЕ. Я отредактировал все операторы SQL и поместил «отредактированный» вместо конфиденциальной информации.

Что дает? Почему я не получаю свои alert();?

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, чтобы помочь мне решить эту проблему! Спасибо.


РЕШЕНИЕ: Спасибо джиттеру за то, что я прямо объяснил обратные вызовы Uploadify.

Контроллер:

class PhotosController < ApplicationController
  # ...
  def create
    @photo = Photo.new(params[:photo])
    @photo.image_content_type = MIME::Types.type_for(@photo.image_file_name).to_s
    @photo.image_width = Paperclip::Geometry.from_file(params[:photo][:image]).width.to_i
    @photo.image_height = Paperclip::Geometry.from_file(params[:photo][:image]).height.to_i
    @photo.save!

    respond_to do |format|
      format.js { render :layout => false }
    end
  end
  # ...
end

Javascript (Uploadify) обратный вызов:

$(function() {
  // add photos link
  $('a.add-photos-link').colorbox({
    overlayClose: false,
    onComplete: function() { wire_add_photo_modal($(this).parent()); }
  });

  function wire_add_photo_modal($parent) {
    <% session_key = ActionController::Base.session_options[:key] %>
    $('#upload_photo').uploadify({
      uploader: '/swf/uploadify.swf',
      script: '/photos',
      cancelImg: '/images/buttons/cancel.png',
      buttonText: 'Upload Photo(s)',
      auto: true,
      queueID: 'queue',
      fileDataName: 'photo[image]',
      scriptData: {
        '<%= session_key %>': '<%= u cookies[session_key] %>',
        commit: 'Adding Photo',
        controller: 'photos',
        action: 'create',
        '_method': 'post',
        'photo[gallery_id]': $('#gallery_id').val(),
        'photo[user_id]': $('#user_id').val(),
        authenticity_token: encodeURIComponent('<%= u form_authenticity_token if protect_against_forgery? %>')
      },
      multi: true,
      onComplete: function(event, queueID, fileObj, response, data) { 
        $parent.find('.gallery-photos').append(response);
      }
    });
  }
});

В create.js.haml (изменен язык шаблонов с ERB, поскольку я просто возвращаю HTML-контент):

- if @photo.gallery.nil?
  =render :partial => 'photos/photo', :locals => { :photo => @photo, :rel => 'unsorted' }
- else
  = render :partial => 'photos/photo', :locals => { :photo => @photo, :rel => gallery.title }

1 Ответ

2 голосов
/ 17 марта 2010

Я не вижу, чтобы вы использовали какой-либо из обратных вызовов uploadify. Таким образом, я думаю, он просто игнорирует все, что сервер отправляет в ответ. Попробуйте связать опцию onComplete с функцией, если вы хотите отправить содержательный ответ обратно на ваш javascript

Проверьте загрузите документацию , чтобы узнать больше

Я полагаю, вы могли бы изменить app/views/photos/create.js.erb на

photo added!

и затем

$('#upload_photo').uploadify({
    ...
    onComplete: function(event, queueID, fileObj, response, data) {
        alert("Server said: "+response+" for file "+fileObj.name);
    }
    ...
});

Если вы хотите добавить фотографию на страницу, вы можете просто позволить серверу вернуть соответствующий HTML-фрагмент, например. Я представляю, что create.js.erb создает / выводит что-то вроде этого

<img src="Xxx.jpg" width="..." height="..." />

Все, что вам нужно сделать в обратном вызове, это

onComplete: function(event, queueID, fileObj, response, data) {
    $("selectorforwheretheimageshouldbeinserted").append(response);
    return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...