我想使用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.rb
或rackup
时,Flash消息会很好地显示。
我该如何解决这个问题?
当我使用shotgun
运行应用时,也会出现另一个问题。在get '/'
方法中,如果我使用flash[:error]
代替flash.now[:error]
,则不会在页面上显示Flash消息。
我正在捣乱this tutorial,但我做了一些分歧:
erb
- &gt; haml
Sinatra::Base
rack-flash
- &gt; sinatra-flash
您可以浏览整个代码here。
感谢您的任何回答/评论。
答案 0 :(得分:4)
shotgun gem在每次请求后重新加载Sinatra。自述文件说:
每次收到请求时,它都会分叉,加载应用程序 子进程,处理请求,退出子进程。该 结果是干净的,应用程序范围内重新加载所有源文件和模板 每个请求。
因此,您需要某种机制来保持不依赖于每个子进程中存储的数据的请求之间的状态。