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

Я хочу показывать флеш сообщения используя 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 я ожидал увидеть флэш-сообщение 'TODO saved successfully.' на домашней странице. Но после перенаправления флэш-сообщения не отображаются, когда я запускаю приложение с помощью shotgun, Flash-сообщения хорошо отображаются при запуске ruby app.rb или же rackup,

Как я могу решить эту проблему?

Другая проблема также возникает, когда я запускаю приложение с помощью shotgun, В get '/' метод, если я использую flash[:error] вместо flash.now[:error], флэш-сообщение не отображается на странице.

Я закрываю этот урок, но внес некоторые изменения:

  • erb -> haml
  • Классическое приложение Синатра -> Подклассы Sinatra::Base
  • rack-flash -> sinatra-flash

Вы можете просмотреть целые коды здесь.

Спасибо за любые ответы / комментарии.

1 ответ

Решение

Камень ружья перезагружает Синатру после каждого запроса. README говорит:

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

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

Другие вопросы по тегам