2

sinatra-redirect-with-flashgemを使用してフラッシュ メッセージを表示したい。

ここに私のルビーコードがあります:

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.'ホームページにフラッシュ メッセージが表示されることを期待していました。しかし、を使用してアプリを実行すると、リダイレクト後にフラッシュ メッセージが表示されませんshotgunruby app.rbまたはを実行すると、フラッシュ メッセージが適切に表示されますrackup

どうすればこの問題を解決できますか?

を使用してアプリを実行すると、別の問題も発生しshotgunます。get '/'メソッドで、代わりに を使用するflash[:error]flash.now[:error]、フラッシュ メッセージがページに表示されません。

私はこのチュートリアルを隠していますが、いくつかの違いを作りました:

  • erb->haml
  • クラシック シナトラ アプリ -> サブクラス化Sinatra::Base
  • rack-flash->sinatra-flash

ここでコード全体を参照できます。

回答/コメントありがとうございます。

4

1 に答える 1

4

ショットガン ジェムは、リクエストのたびに Sinatra をリロードします。READMEには次のように書かれています:

リクエストを受信するたびに、フォークし、アプリケーションを子プロセスにロードし、リクエストを処理して、子プロセスを終了します。その結果、リクエストごとにすべてのソース ファイルとテンプレートがアプリケーション全体でクリーンにリロードされます。

その結果、各子プロセスに格納されたデータに依存しない、リクエスト間の状態を保持する何らかのメカニズムが必要になります。

于 2012-06-09T14:41:33.623 に答える