2010-02-09 6 views
9

Ich bin neugierig, was die beste Möglichkeit, eine Schiene teilweise mit jQuery zu laden. Bisher habe ich eine Lösung nicht versucht arbeiten:laden teilweise mit jquery und Schienen

$('#imagecontent').load('/newsletters/_image_gallery.html.erb', function() { 
alert('Load was performed.'); 
}); 

Ist die beste Lösung eine Route eine separate Aktion und/oder Controller für diese und einrichten zu bauen? Ich frage, weil die erste Lösung einfacher zu machen scheint, vielleicht nicht so erholsam.

Danke.

+0

nur als Anmerkung, können Sie nicht verwenden .html() Sie partials zu laden entweder sind. Selbst wenn Sie es mit Ruby-Code aufrufen. Dies liegt daran, dass es die gesamte Form zwischen Anführungszeichen rendert und alles durcheinander bringt. Ich würde einen anderen Weg vorschlagen, wenn ich einen wüsste, obwohl ich das selbst suche. –

Antwort

8

Sie sollten nicht in der Lage sein, von HTTP-Anfragen auf Vorlagendateien (.erb) zuzugreifen, dies ist sehr unpraktisch. Ich schlage vor, dass Sie sie außerhalb Ihres Web-Server-Pfades platzieren und nur über Ihre Anwendung darauf zugreifen.

Ich bin nicht sicher über Rails, aber ich nehme an, Sie müssen einen separaten Controller (oder was auch immer) erstellen, um dies zu tun.

EDIT ist dies, weil .erb Dateien Ruby-Dateien eingebettet sind, und wenn Sie versuchen, sie zu beantragen, werden Sie alle unerwünschten Daten, wie <%= page_title %> bekommen, dass Sie nicht wollen, um die Benutzer zu zeigen. Daher müssen Sie diese .erb-Dateien über Ihre Rails-Anwendung weitergeben, damit sie ordnungsgemäß in HTML interpretiert werden.

+0

ok - danke für den Einblick. Ich werde es entsprechend strukturieren. – Christian

3

Der Grund dafür, dass der Code nicht funktioniert, ist, dass Rails keine Ansichtsdateien außerhalb des Systems bereitstellen. Um das zu erreichen das, was Sie wollen, müssen Sie eine Aktion benötigen, die diesen Teil machen würden:

def image_gallery 
    render :partial => "image_gallery" 
end 

Auch gibt es ein Plugin namens jRails die Standard-Ajax-Helfer ersetzt (der Prototyp verwenden) mit gleichwertigen jquery-orientiert ist. In Ihrem Fall würden Sie so etwas wie

<%= remote_function(:update => "imagecontent", :url => "/newsletters/image_gallery") %> 

Und noch mehr, in Rails 3 werden Sie nicht brauchen, es zu benutzen. Siehe this link.

+0

danke - Ich freue mich darauf, alle neuen Sachen in Rails 3 zu sehen. – Christian

3

Mit 3 Schienen Sie ...

Controller tun konnte

@content = '/some/partial' 

Ansicht - entweder haml.erb (html.erb) oder js.erb

$('#myDiv').html("<%= escape_javascript render @content %>"); 

Sie könnten dies versuchen, wenn Schienen 2 (nur Prototyp verfügbar, wenn noConflict hinzugefügt) ...

In der Steuerung

@content = render :partial=>"https://stackoverflow.com/users/cool_partial" 

Ihre js

myFunction(#{@content.to_json}) 

Ihre Funktion aufrufen ...

myFunction = function(content){ 

    $("myDiv").html(content); 

} 

Ich stimme mit Neutrino, dass dies besser behandelt werden könnte über eine Aktion.

def get_partial 
    render 'some/partial' 
end 

hoffe, das hilft

3

Eine weitere Alternative:

$('#imagecontent').html('<%= escape_javascript render 'newsletters/image_gallery' %>');