2

我想使用sinatra-redirect-with-flashgem 显示 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.'在主页上看到 flash 消息。但是当我使用shotgun. ruby app.rb当我运行或运行时,Flash 消息显示得很好rackup

我怎么解决这个问题?

当我使用shotgun. 在get '/'方法中,如果我使用flash[:error]而不是flash.now[:error],则 Flash 消息不会显示在页面上。

我正在修改本教程,但我提出了一些不同之处:

  • erb->haml
  • 经典 Sinatra 应用程序 -> 子类化Sinatra::Base
  • rack-flash->sinatra-flash

你可以在这里浏览整个代码。

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

4

1 回答 1

4

每次请求后,霰弹枪宝石都会重新加载 Sinatra。自述文件说:

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

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

于 2012-06-09T14:41:33.623 回答