从Sinatra的实例范围运行方法

时间:2011-09-09 02:53:54

标签: ruby sinatra

我正在使用ActionMailer发送电子邮件,但我想使用Sinatra的Tilt渲染。我不知道如何从Sinatra外部访问Sinatra的实例范围,所以我可以这样做:

class Mailer < ActionMailer
  def test(address)
    mail(:to=>address,
         :body => 'turns out you need something here?') do |format|
      details = erb(:myview)
      format.text { details }
      format.html { markdown(details) }
    end
  end
end

希望你能看到我正在尝试做的事情,但目前我正在找到'找不到方法'的错误。有什么想法我可以在格式块中包含Sinatra的实例范围吗?

感谢。

1 个答案:

答案 0 :(得分:1)

以下是几个选项。

排名第一(有点难看)

class Mailer < ActionMailer
  def test(address, instance)
    mail(:to=>address,
         :body => 'turns out you need something here?') do |format|
      details = instance.erb(:myview)
      format.text { details }
      format.html { markdown(details) }
    end
  end
end

然后在你的应用中

get '/send_mail' do
  Mailer.new.test('bob@example.com', self)
end

第二名

在应用的帮助块中定义您的Mailer类。这应该可以访问 erb 。我使用普通的 mail gem做了一些非常类似的事情。除了我定义了一个方法而不是整个类。但是,认为它应该仍然有用。

helpers do
  class Mailer < ActionMailer
    def test(address)
      mail(:to=>address,
           :body => 'turns out you need something here?') do |format|
        details = erb(:myview)
        format.text { details }
        format.html { markdown(details) }
      end
    end
  end
end

第三名

查看Sinatra和/或Tilt的代码,按照 erb 向上堆栈,直到它不再关心请求实例,并复制它。