2012-03-07 16 views
5

W mojej obecnej aplikacji rails używam biblioteki ajax uploader, która wymaga odpowiedzi z jsonem {success:true}, aby wskazać, że plik został pomyślnie przesłany.Rails JS Response, renderuje status i szablon?

W mojej aplikacji pliki to obrazy, a po przesłaniu chciałbym dodać to do strony. Normalnie bym zrobił coś takiego:

respond_to do |format| 
    format.html { redirect_to @resource, :notice => 'Created.' } 
    format.js 
end 

w powyższym przykładzie moja odpowiedź JS uczyniłaby odpowiedni szablon, taki jak create.js.erb który może powiedzieć coś takiego ...

$('#resources').append('<%= escape_javascript(render '@resource') %>'); 

To jak mam robiłem rzeczy takie jak komentarze Ajax itp. w przeszłości. Teraz, aby uzyskać uploader pracuje mój respond_to blok aktualnie robi to:

format.js { render :json => { :success => true } } 

To sprawia, że ​​praca do przesyłania ale wydaje mi się wykluczają dodawanie świadczonych partials do strony jakbym normalnie z odpowiedzi Ajax.

Moje pytanie brzmi, czy jest jakiś sposób, aby to osiągnąć? Jeśli nie, w jaki sposób wypełniłeś stronę renderowanymi obiektami po ich pomyślnym utworzeniu?

Odpowiedz

3

Nie można wykonywać obu bezpośrednio ze sterownika lub przy użyciu szablonów widoku. Wygląda na to, że program ładujący ajax oczekuje odpowiedzi, którą można przeanalizować jako JSON, więc dodanie innej odpowiedzi za pomocą szablonu (co oznaczałoby niepodanie format.js { render :json => { :success => true }}) nie odeśle JSON jako treści odpowiedzi.

Patrząc na source dla wtyczki, można zobaczyć, że można zdefiniować metodę uruchamiania onComplete, która daje odpowiedź JSON.

To jest niesprawdzone, ale powinno Cię do siebie zbliżyć. Więc jeśli rozszerzyć swoją odpowiedź JSON jak

format.js do 
    partial = render_to_string @resource 
    render :json => { :success => true, :partial => partial } 
end 

potem w JavaScript na stronie podczas konfigurowania ajax uploader, dodaj zwrotnego

var uploader = new qq.FileUploader({ 
    element: document.getElementById('file-uploader'), 
    action: '/upload', 
    onComplete: function(id, fileName, responseJSON) { 
    $('#resources').append(responseJSON.partial); 
    } 
}); 
+0

ten pomysł działa. Nie wiedziałem o 'render_to_string', ale w testowaniu znalazłem, że mogę również użyć' .getScript' w wywołaniu zwrotnym, aby pobrać częściowe. Twoja metoda jest czystsza. Dzięki! – Andrew

+0

Jedna uwaga ... domyślnie 'escape_javascript' nie jest dostępna dla kontrolera i nie jest potrzebna, ponieważ metoda' render: json' robi to mimo wszystko. – Andrew

+0

fajne, cieszę się, że to pomaga. Ma sens, że 'escape_javascript' nie działa tam, nie wiem o czym myślałem. Dziękuję za opinię na temat odpowiedzi – danivovich