2016-03-23 7 views
1

Wenn eine AJAX-Anforderung ausgeführt wird, gibt show.js.erb die partielle _article.haml.Das Rendern von JS.ERB führt zu einem Rohcode

Was ich will, in show.js.erb zu tun in der Lage sein zu schreiben ist:

<%= j render 'article' %> 

Da es eine .js Erweiterung ich verpflichtet bin, hat dies in JavaScript umwickeln (das obige Beispiel nicht die teilweise nicht machen), so:

'<%= j render 'article' %>' OR ('<%= j render 'article' %>'); 

Dies würde die teilweise aber mit Rohcode machen - einschließlich HTML und JS entkommen.

('things will go back to \"normal.\"<\/p>\n\n'); 

Was ist der richtige Weg, dies zu tun?

welcome#index:

.ajax_load.article-content{ data: { 'remote-url' => article_path(@article) } } 

articles.js:

$(document).ready(function() { 
    $('.ajax_load').each(function(index, element) { 
    var url = $(element).data('remote-url') 
    if (url) { 
     $.get(url, function(responseText) { 
     $(element).html(responseText); 
     }) 
    } else { 
     console.log("missing url for ajax!") 
    } 
    }) 
}) 
+0

Die jQuery 'html (string)' Funktion sollte eigentlich den Text in HTML umwandeln (aus dem Dokument: http://api.jquery.com/html/). Haben Sie in der Show-Aktion versucht, einen 'render'-Artikel' als Antwort für JS-Aufrufe zu erstellen? – MrYoshiji

+0

Versuchen Sie '.text (responseText)' zu verwenden, aber ich bin mir ziemlich sicher, dass es nicht funktioniert - versuchen Sie '.html ($ .parseHTML (responseText))' – MrYoshiji

+0

Nein Ihre Frage ist bereits als jQuery markiert. Vielleicht verwenden Sie einen besseren Fragetitel, wie 'anhängende AJAX-Antwort mit jQuery rendern nicht HTML' – MrYoshiji

Antwort

1

Diese Antwort auf @MrYoshiji gehört.

Ajax:

$(document).ready(function() { 
     $('.ajax_load').each(function(index, element) { 
     var url = $(element).data('remote-url') 
     if (url) { 
      $.get(url, function(responseText) { 
      $(element).html(responseText); 
      }, 'html') 
     } else { 
      console.log("missing url for ajax!") 
     } 
     }) 
    }) 

articles_conroller macht _article teilweise direkt:

def show 
    #respond to JS 
    respond_to do |format| 
     format.js { render :partial => "article" } 
    end 
end 

welcome#index:

.ajax_load.article-content{ data: { 'remote-url' => article_path(@article) } } 
0

Sie müssen entscheiden, wo Sie die teilweise machen möchten. In den meisten Fällen würden Sie den Container auf der Seite mit jQuery greifen und die teilweise einfügen da wie:

$('#article-container').html('<%= j render 'article' %>'); 
+0

Danke für deine Antwort, Brandon! Ich denke der jQuery-Selektor ist nicht notwendig, da er bereits * where * kennt um das partielle zu rendern, das einzige ist, dass es so mit entsetzlicher Flucht geht. Was denken Sie? Ich aktualisierte auch meine Antwort mit mehr Info. – Liroy

+0

Oh, ich wusste nicht, dass du es mit benutzerdefinierten jQuery loslässt. Wenn Sie "remote: true" für einen Link oder eine Schaltfläche oder etwas verwenden würden, würden Sie den Selektor in den partiellen einschließen. In diesem Fall würde ich JSON vom Controller rendern, nicht eine Ansicht und dann partiell den JSON in der obigen jQuery. – brandonhilkert

+0

Das macht Sinn, aber da ich der Ansicht mehr Elemente hinzufügen müsste, wie zum Beispiel Buttons, wäre es besser, sie als View anstatt als JSON-Daten darzustellen. Die Sache ist, es scheint perfekt zu funktionieren, braucht nur die Flucht behoben. – Liroy

Verwandte Themen