4

きゅうりのテストを実行し、その結果を電子メールで通知する sinatra アプリがあります。Email gem は Pony で、この通知用の haml テンプレートがあります。

このロジックはルート内で機能します。

require 'sinatra'
require 'haml'
require 'pony'

get "/execute_all/?" do
  execute_all_tests()
  Pony.mail :to => "recipients@email.com",
      :from => "do-not-reply@email.com",
      :subject => "Test results,
      :html_body => haml(:email_layout)

      redirect "/"

end

ただし、これらのアクションに rufus スケジューラでスケジュールされたジョブを使用すると、次の例外が発生します。

scheduler caught exception:
undefined method `haml' for main:Object

コードはルートからのコピーパスタです:

   scheduler = Rufus::Scheduler.start_new
   scheduler.every '2h' do
      execute_all_tests()
      Pony.mail :to => "recipients@email.com",
          :from => "do-not-reply@email.com",
          :subject => "Test results,
          :html_body => haml(:email_layout)
   end

2 つのメソッドはすべて同じファイルにあり、Sinatra アプリを実行するために実行されます。

この例外を取り除き、haml テンプレートをスケジュールされたジョブとしてメールを送信するにはどうすればよいですか?

4

2 に答える 2

7

このhamlメソッドは、Sinatraへのリクエストのコンテキストでのみ使用可能であり(のインスタンスメソッドですSinatra::Base)、Sinatraリクエストの外部で使用することはできません。

Hamlテンプレートをレンダリングするには、HamlAPIを直接使用できます。

haml_template = File.read(File.join(settings.views, 'email_layout.haml'))

scheduler = Rufus::Scheduler.start_new
  scheduler.every '2h' do
    execute_all_tests()
    Pony.mail :to => "recipients@email.com",
      :from => "do-not-reply@email.com",
      :subject => "Test results",
      :html_body => Haml::Engine.new(haml_template).render(binding)
  end
end

execute_all_testsここでは、Hamlテンプレートで参照されているインスタンス変数を使用していると想定しているため、これらの変数にアクセスするためbindingにをHamlrenderメソッドに渡します。また、2番目のパラメーターとして必要なHamlオプションをに渡す必要がある場合もありますnew

于 2012-07-10T19:40:12.637 に答える
1

同じユーザーとして rufus と sinatra を実行していますか? これは、これらの問題の多くで繰り返されるテーマのようです。

于 2012-07-09T05:33:22.877 に答える