0

これは、ルート ブロック内のコードの末尾です。何が起こっているかというと、success_loader がレンダリングされず、代わりに Sinatra が null 応答を送信することです (ページは空白です)。

if v.test
  mydata = v.sheetData
end
if v.errors.size == 0
  #success
  haml :success_loader, :layout => :base, 
       :locals => {:pub_path => settings.root, :app_ver => settings.version }
else
  #fail
  haml :failure_loader, :layout => :base, 
       :locals => {:pub_path => settings.root, :app_ver => settings.version, 
       :app_error => v.errors }
end 
File.delete(target) if File.exists?(target)

デバッガーを使用して、haml への呼び出しが始まるポイントから始まる各行を表示します

haml :success_loader, :layout => :base, 
     :locals => {:pub_path => settings.root, :app_ver => settings.version }
getter = proc { value }

value = :pub_path

getter = proc { value }

value = :apper_ver

File.delete(target) if File.exists?(target)
@params = @original_params
filter! :after unless env['sinatra.static_file']
res = [res] if Fixnum === res or String === res
if Array === res and Fixnum === res.first
status(res.shift)
body(res.pop)
headers(*res)
invoke { error_block!(response.status) }
unless @response['Content-Type'

より類似した行を束ねます。次に、これで始まる Thin からの数行:

log "!! Rack application returned nil body. Probably you wanted it to be an empty string?" if @response.body.nil?

ルートの外でコードをテストしたので、例外はスローされません。haml テンプレートは、他のルートで使用すると正常に機能します。何が起こっているのですか?

4

1 に答える 1

1

ボディは、ルートブロックで最後に評価されるものになります。最後に:

File.delete(target) if File.exists?(target)

File.deleteのドキュメントから、次のことがわかります。

名前付きファイルを削除し、引数として渡された名前の数を返します。

targetですから、それは存在しなかったか、存在したと推測していnilます。これにより、そのステートメントはnilと評価されます。

ボディを最後より早く設定したい場合は、ボディヘルパーを使用してください:

body = if v.errors.size == 0
  #success
  haml :success_loader, :layout => :base, 
       :locals => {:pub_path => settings.root, :app_ver => settings.version }
else
  #fail
  haml :failure_loader, :layout => :base, 
       :locals => {:pub_path => settings.root, :app_ver => settings.version, 
       :app_error => v.errors }
end 
File.delete(target) if File.exists?(target)

しかし、これは少しリファクタリングすることができます:

template = v.errors.size == 0 ? :success_loader : :failure_loader
File.delete(target) if File.exists?(target)
haml template, :layout => :base, 
               :locals => {
                 :pub_path => settings.root,
                 :app_ver => settings.version, 
                 :app_error => v.errors
               }.delete_if{|k,v| v.nil?}
于 2013-03-07T14:11:29.647 に答える