2012-06-09 56 views
2

我想使用sinatra-redirect-with-flash寶石顯示閃存消息。爲什麼Sinatra-redirect-with-flash gem與霰彈槍搭配使用?

這裏是我的Ruby代碼:

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運行我的應用程序時,重定向後不會顯示任何閃存消息。當我運行ruby app.rbrackup時,Flash消息顯示得很好。

我該如何解決這個問題?

當我使用shotgun運行應用程序時,也會發生另一個問題。在get '/'方法中,如果我使用flash[:error]而不是flash.now[:error],則Flash頁面上不會顯示。

我shadowning this tutorial,但我做了一些不同之處:

  • erb - >haml
  • 經典西納特拉應用程序 - >子類Sinatra::Base
  • rack-flash - >sinatra-flash

你可以瀏覽整個代碼here

感謝您的任何答覆/評論。

回答

4

shotgun gem在每次請求後重新加載Sinatra。自述說:

每次收到請求時,它會分叉,將應用程序加載到 子進程中,處理請求並退出子進程。 結果是乾淨的,在每個請求的 上的全部應用程序範圍內重新加載所有源文件和模板。

因此,您將需要某種機制來保存不依賴存儲在每個子進程中的數據的請求之間的狀態。