2009-06-20 8 views
1

Ich habe eine Seite, die Inhalt aus einer Datenbank und möglicherweise anderen Quellen abrufen muss.Wie kann ich mit JQuery Inhalte aus einer Datenbank über eine Ruby-on-Rails-Methode laden?

So habe ich meine Ruby on Rails-Anwendung strukturiert.

/Index - dies hat drei verschiedene Abschnitte, die in drei verschiedenen Inhaltstypen geladen werden müssen. Jeder wird eine andere Zeit benötigen, um zurückzukehren, daher möchte ich eine Lade-Nachricht anzeigen, während ich spiele, damit jedes Div mit Daten gefüllt wird.

Um die Daten zu laden, möchte ich idealerweise eine Ruby-Methode auf meinem Controller aufrufen und dann eine partielle rendern.

Ich hatte eine Suche herum, aber ich kann nicht sehen, wie Sie den Seitenindex laden und dann Daten von Aktionsmethoden als separate Aktion laden können.

Antwort

4

Wenn Sie eine neuere Version von Rails verwenden, und wollte dies auf eine unaufdringliche Art und Weise wie möglich tun, dann würden Sie die verwenden: respond_to Optionen in Ihrem Controller, etwa so:

class MyController < ApplicationController 

    def first_method 
    respond_to do |format| 
     format.html # this handles normal requests asking for html 
     format.js # this handles requests asking for javascript to be sent instead 
     end 
    end 

end 

Wenn Sie mit einem Klick sind reagieren, würden Sie so etwas wie Brennen die Abfrage wie so auf der Seite

$("a.element_you_click_to_trigger").click(function(e) { 
    e.preventDefault(); // make sure clicking doesn't trigger unneeded event bubbling 
    $.ajax({url: "/controller/first_method", type: "POST", dataType: "script"}); // send a request and tell the server that you want javascript back 
} 

Genau das tun, wie Sie eine index.html.erb Datei in Ihren Ansichten haben einen Ordner für die Controller, Sie hätten eine ähnliche first_method.js.erb Datei in den entsprechenden Ansichten Ordner an der Seite Ihre index.html.erb Datei:

views 
    controller 
    index.html.erb 
    first_method.js.erb 

Dies wird Javascript zurück, die Client-Seite ausgeführt wird, aber es wird Server-Seite bauen, so dass Sie Schienen ERB-Fragmente enthalten, so dass Sie tun können, so etwas wie dieses:

$('#loading_placeholder_element').html('<%= escape_javascript(render(:partial => "create")) %>'); 

// do some other stuff you fancy in the page 

// then make the next call once the other stuff is over (you may need to add this as a call back on an animation): 
$.ajax({url: "/controller/second_method", type: "POST", dataType: "script"}); 

Sie würden dann den gleichen Vorgang wiederholen Sie für jeden der anderen mehr Methoden, die hervorgehoben fsmf.

Ich fand diese Railscast on jQuery unglaublich hilfreich, als ich das vor ein paar Monaten lernte, und ich würde es wirklich empfehlen.

Hoffe, das hilft!

+0

Danke, das ist der Ansatz, den ich bei der Entwicklung der Seite gemacht habe. Danke für die Bestätigung meiner Idee :) –

0

Sie müssen Ajax dafür verwenden.

http://docs.jquery.com/Ajax

Ich weiß nicht, wie auf Schienen Rubin oder Rubin zu verwenden. Aber ich denke, das Konzept ist das gleiche.

Ein Beispiel:

$.post("yourAjaxTarget.html",{ //html as an example 
    attribute1: "blabla", 
    attribute2: 1234 
     }, function(data){ 
     //do something 
     }, "json"); 
0

Unter der Annahme, dass Sie jRails plugins installiert.

class MyController < ApplicationController 

    def index 
    # your main action 
    end 

    def long_section 
    # this method should accept XHR requests 
    # and render the HTML view 
    # long_section.html.erb 
    render :layout => false # or partial 
    end 

    def very_long_section 
    # this method should accept XHR requests 
    # and render the HTML view 
    # very_long_section.html.erb 
    render :layout => false # or partial 
    end 

end 

In Ihrer Ansicht index.html.erb.

<h1>Index</h1> 

<div id="index">First section here.</div> 
<div id="second">Second section here.</div> 
<div id="third">Third section here.</div> 

<%= remote_function(:action => "long_section", :update => "second") %> 
<%= remote_function(:action => "very_long_section", :update => "third") %> 
Verwandte Themen