Ich habe eine Rails-App, die alle Ihre Facebook-Kontakte importiert. Das braucht etwas Zeit. Ich würde gerne eine "Bitte warten" Seite zeigen, während der Import im Hintergrund stattfindet.Schienen "Bitte warten" Seite
Es scheint, dass ich render und redirect_to nicht auf die gleiche Aktion im Controller setzen kann. Wie kann ich das machen?
if @not_first_time
Authentication.delay.update_contact_list(current_user)
else
render 'some page telling the user to wait'
Authentication.import_contact_list(current_user)
end
redirect_to :root_path, :notice => 'Succesfully logged in'
Wenn es der Benutzer erstmals in der Website ist, möchte ich eine machen „bitte Seite warten“, starten Sie den Import, und sobald seine auf den Stammpfad getan umleiten, wo eine Menge Verarbeitung dieser Daten
passiert, wenn es nicht das erste Mal ist, dann setzen sie den Kontakt Update im Hintergrund (mit dem delayed_jobs Juwel) und gehen sie direkt auf die Homepage
ich die fb_graph gem bin mit den Kontakte zu importieren. Hier ist die Methode
def self.import_contact_list(user)
user.facebook.friends.each do |contact|
contact_hash = { 'provider' => 'facebook', 'uid' => contact.identifier, 'name' => contact.name, 'image' => contact.picture(size='large') }
unless new_contact = Authentication.find_from_hash(contact_hash)
##create the new contact
new_contact = Authentication.create_contact_from_hash(contact_hash)
end
unless relationship = Relationship.find_from_hash(user, new_contact)
#create the relationship if it is inexistent
relationship = Relationship.create_from_hash(user, new_contact)
end
end
Ende
bearbeiten
Ich habe die Lösung unten vorgeschlagen, es funktioniert!
Hier ist meine ‚warten Sie, während wir Kontakte importieren‘ Blick von der Aktion „Warten“
<script>
jQuery(document).ready(function() {
$.get("/import_contacts", function(data) {
window.location.replace("/")
});
});
</script>
<% title 'importing your contacts' %>
<h1>Please wait while we import your contacts</h1>
<%= image_tag('images/saving.gif') %>
Dank!
Haben Sie über Ajax gedacht? vielleicht würde dies zu einer viel einfacheren und flüssigeren Lösung führen. – alex
AJAX ist die Lösung für Sie. Sehen Sie sich http://api.jquery.com/jQuery.get/ an, wenn Sie jQuery verwenden. AJAX get in jQuery bietet eine Callback-Funktion, die ausgeführt wird, wenn die Anfrage zurückkehrt (in Ihrem Fall werden die Kontakte importiert). Nachdem die Anfrage zurückgeschickt wurde, können Sie sich die gewünschte Nachricht anzeigen lassen (in Ihrem Fall "Erfolgreich eingeloggt") – mohamagdy
Ich habe an Ajax gedacht. Aber ich importiere mit dem [fb_graph Juwel] (https://github.com/nov/fb_graph), und ich möchte nicht in den Edelstein-Code einbrechen ... siehe bearbeitete Antwort oben – wachichornia