Почему камень Синатра-редирект-с-вспышкой не работает с дробовиком?
Я хочу показать флэш-сообщения с помощью sinatra-redirect-with-flash
джем.
Вот мой рубиновый код:
require 'sinatra'
require 'sinatra/base'
require 'sinatra/flash'
require 'sinatra/redirect_with_flash'
require 'data_mapper'
require 'haml'
require 'builder'
# ...
class App < Sinatra::Base
enable :sessions
register Sinatra::Flash
helpers Sinatra::RedirectWithFlash
use Rack::MethodOverride
get '/' do
@notes = Note.all :order => :id.desc
@title = 'All TODOs'
if @notes.empty?
flash.now[:error] = 'No TODOs found. Add your first below.'
end
haml :home
end
post '/' do
n = Note.new
n.content = params[:content]
n.created_at = Time.now
n.updated_at = Time.now
if n.save
redirect '/', :notice => 'TODO saved successfully.'
else
redirect '/', :error => 'Failed to save TODO.'
end
end
# ...
end
И views/layout.haml
это:
!!! 5
%html{:lang => "en"}
%head
%meta{:charset => "utf8"}
%body
%header
%hgroup
%h1
%a{:href => "/"}= SITE_TITLE
%h2= SITE_DESCRIPTION
#main
=styled_flash
=yield
После успешного добавления задачи я ожидал увидеть флэш-сообщение 'TODO saved successfully.'
на домашней странице. Но никаких флэш-сообщений не отображается после перенаправления, когда я запускаю свое приложение с помощью shotgun
. Флэш-сообщения хорошо отображаются, когда я запускаю ruby app.rb
или rackup
.
Как я могу решить эту проблему?
Другая проблема также происходит, когда я запускаю приложение используя shotgun
. В методе get '/'
, если я использую flash[:error]
вместо flash.now[:error]
, флэш-сообщение не отображается на странице.
Я затеняю этот учебник , но я сделал некоторые различия:
-
erb
->haml
- классическое приложение Синатры - > подклассы
Sinatra::Base
-
rack-flash
->sinatra-flash
Вы можете просмотреть целые коды здесь.
Спасибо за любые ответы/комментарии.
1 ответ:
Дробовик gem перезаряжает Синатру после каждого запроса. README говорит:
Каждый раз, когда запрос получен, он разветвляется, загружает приложение в дочерний процесс обрабатывает запрос и выходит из дочернего процесса. То результатом является чистая, прикладная перезагрузка всех исходных файлов и шаблонов на каждый запрос.
В результате вам понадобится какой-то механизм для сохранения состояния между запросами, который не зависит от данных, хранящихся в каждом дочернем элементе процесс.