2012-04-07 3 views
3

У меня есть приложение для рельсов, которое импортирует все ваши контакты в Facebook. Это занимает некоторое время. Я хотел бы показать страницу «Подождите, подождите, пока импорт будет происходить в обратном направлении».Rails «please wait» страница

Кажется, что я не могу поместить рендер и redirect_to на одно и то же действие в контроллере. Как я могу это сделать?

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' 

Если это пользователи первый раз на сайте, я хочу, чтобы отрендерить «Пожалуйста, подождите страницы», начать импорт, и как только его сделали перенаправление на корневой путь, где много обработки этих данных происходит

Если это не первый раз, а затем поставить обновление контактов в фоновом режиме (с использованием delayed_jobs камня) и идти прямо на главной странице

Я использую fb_graph камень импортировать контакты. Вот метод

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 

конец

Редактировать

Я добавил решение, предложенное ниже, это работает!

Вот это мой «Подождите, пока мы импортировать контакты» вид из действия «ждать»

<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') %> 

Спасибо!

+0

Вы думаете об использовании ajax? возможно, это приведет к значительно более легким и более жидким растворам. – alex

+1

AJAX - это решение для вас. Посмотрите на этот http://api.jquery.com/jQuery.get/, если вы используете jQuery. AJAX в jQuery предоставляет функцию обратного вызова, которая будет выполняться при возврате запроса (в вашем случае контакты будут импортированы). После возврата запроса вы можете просмотреть любое сообщение, которое вы хотите (в вашем случае «Успешно вошел») – mohamagdy

+0

Я действительно думал об использовании Ajax. Но я импортирую с помощью [fb_graph gem] (https://github.com/nov/fb_graph), и я бы не хотел врываться в код драгоценных камней ... см. Отредактированный ответ выше – wachichornia

ответ

1

Один запрос получает один ответ - вы не можете отображать контент и перенаправлять.

Если бы я был вами, я бы всегда выполнял длительный процесс в отложенной работе - связывание экземпляров с пассажирами/единорогами никогда не будет отличной идеей. Отобразите страницу «Подождите, подождите», которая периодически обновляется, чтобы проверить, завершено ли задание с задержкой (если вы закрепили идентификатор отложенного задания, вы можете проверить, все ли он в db. Когда завершение te будет удалено). Когда задание будет завершено, переадресовывайтесь на страницу результатов. Вы также можете выполнить бит периодической проверки через ajax.

+0

Это было мое первоначальное намерение, но оказалось, что delayed_job никогда не начинает обработку данных, пока сервер занят, а сервер всегда занят. Таким образом, на работу потребуется несколько часов (если не навсегда), чтобы они были фактически выполнены (протестированы). Есть ли способ изменить это поведение? – wachichornia

+0

Это не похоже на то, что я когда-либо видел, замедленную работу - он не знает, что делают экземпляры приложения –

 Смежные вопросы

  • Нет связанных вопросов^_^