Почему камень Синатра-редирект-с-вспышкой не работает с дробовиком?


Я хочу показать флэш-сообщения с помощью 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 2

1 ответ:

Дробовик gem перезаряжает Синатру после каждого запроса. README говорит:

Каждый раз, когда запрос получен, он разветвляется, загружает приложение в дочерний процесс обрабатывает запрос и выходит из дочернего процесса. То результатом является чистая, прикладная перезагрузка всех исходных файлов и шаблонов на каждый запрос.

В результате вам понадобится какой-то механизм для сохранения состояния между запросами, который не зависит от данных, хранящихся в каждом дочернем элементе процесс.