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
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
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…
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.
Resque jest supersexy bo ma backend w Redisie i jest sprawdzone w boju, bo używane przez Github. Znaczy zgadzam się, wypas 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 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