Render i dlugi czas wykonania medoty modelu

Nie wiem jak rozwiązać problem z renderowaniem strony.
W kontrolerze mam metodę “create”, która wywołuje metodę modelu “create”. Metoda ta wykonuje się długo i do czasu zakończenia wykonania tej metody nie nastąpi wyświetlenie strony “create.html”.
W wywoływanej metodzie modelu zbieram komunikaty o stanie procesu do tablicy “messages”, które mają być wyświetlone na stronie “create.html”.

Chciałbym aby kontroler po wywołaniu @user.create od razu wyrenderował stronę “create.html” i ją wyświetlił nie czekając na zakończenie @user.create.
Docelowo na stronie “create.html” chcę Ajaxem co np. 1 sek odpytywać serwer i wyświetlać komunikaty z @user.messages.

Poniżej fragmenty kodu.

Model user.rb

[code]class User
attr_reader :messages

def initialize
@messages = []
end

def add_message(message)
@messages << message
end

#ta metoda wykonuje sie dlugo ale tak ma byc :slight_smile:
def create
[…] //jakis fragment kodu
add_message “komunikat 1”

[...] //jakis fragment kodu
add_message "komunikat 2"

[...] //jakis fragment kodu
add_message "komunikat 3"
 .
 .
 .
[...] //jakis fragment kodu
add_message "komunikat n"

end
end[/code]
Kontroler user_controller.rb

class UserController < ApplicationController def create @user = User.new @user.create //to wykonuje sie dlugo ale tak musi byc :) end end
Widok create.html.erb

<% if @user!=nil and @user.messages %> <%= error_messages_for 'user' %> <%= render(:partial=>'create_process',:collection=>@user.messages) %> <% end %>
Partial _create_process.html.erb

<%= create_process %><br/>

Długo trwające zadanie musisz wysłać do jakiegoś background workera i asynchronicznie ajaxem wywoływać jakiś request, który będzie Ci podawał message do pokazania na stronie…

Dzięki za podpowiedź.
background worker - słowo klucz, którego mi brakowało do pełni szczęścia :slight_smile:

Teraz niestety będziesz musiał się zdecydować na jakiś plugin do tego a jest ich z kilka conajmniej :slight_smile: Trudny wybór.

Najłatwiej będzie Ci zacząć z delayed_job (jest też fajny railscast o tym). A jak już będzie śmigało, możesz powoli zgłębiać AMQP i jego chyba najpopularniejszy serwer (provider MQ) – RabbitMQ.

Ewentualnie resque:

Resque jest supersexy bo ma backend w Redisie i jest sprawdzone w boju, bo używane przez Github. Znaczy zgadzam się, wypas :slight_smile: ale pozwól koledze wystartować z jakimś lżejszym (obłożonym mniejszym stosem technologicznym) rozwiązaniem.

Bardzo prawdopodobne, że prawdziwie “trve” rozwiązań (AMQP) nie będzie musiał nawet sprawdzać, bo delayed_job albo resque w pełni zaspokoją jego potrzeby.

Wygląda na to, że moje potrzeby na chwilę obecną w zupełności zaspokaja background rake, którego znalazłem w railscastach (127). Co do delayed_job to też obejrzałem o nim railscasta - na pierwszy rzut oka wygląda bardzo ciekawie i postaram się go przećwiczyć. Jeśli “background rake” nie będzie się sprawdzał to przerzuce się na delayed_job.

Skorzystam z uwagi Tomasha i zaczne od czegoś prostego a potem pobawie się delajed_job, resque, AMQP, bo temat jest ciekawy :slight_smile: Ale to już dla samej ciekawości i zobaczenia możliwości tych rozwiązań.

Dziś w RSSach znalazłem to: http://github.com/jeffkreeftmeijer/navvy/ – w skrócie inspirowany delayed_job, ale zorientowany na bycie DB-agnostic i tym samym potrafiący obsługiwać zlecenia przez ActiveRecord, Sequel i MongoMapper :smiley:

http://github.com/collectiveidea/delayed_job/tree/backends database-agnostic fork DJ