为什么sinatra-redirect-with-flash gem不能用霰弹枪?

时间:2012-06-09 04:40:50

标签: ruby sinatra haml shotgun

我想使用sinatra-redirect-with-flash gem来显示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后,我希望在主页上看到flash消息'TODO saved successfully.'。但是,当我使用shotgun运行我的应用程序时,重定向后不显示任何Flash消息。当我运行ruby app.rbrackup时,Flash消息会很好地显示。

我该如何解决这个问题?

当我使用shotgun运行应用时,也会出现另一个问题。在get '/'方法中,如果我使用flash[:error]代替flash.now[:error],则不会在页面上显示Flash消息。

我正在捣乱this tutorial,但我做了一些分歧:

  • erb - &gt; haml
  • Classic Sinatra app - &gt;子类化Sinatra::Base
  • rack-flash - &gt; sinatra-flash

您可以浏览整个代码here

感谢您的任何回答/评论。

1 个答案:

答案 0 :(得分:4)

shotgun gem在每次请求后重新加载Sinatra。自述文件说:

  

每次收到请求时,它都会分叉,加载应用程序   子进程,处理请求,退出子进程。该   结果是干净的,应用程序范围内重新加载所有源文件和模板   每个请求。

因此,您需要某种机制来保持不依赖于每个子进程中存储的数据的请求之间的状态。