在rails 4中的lib类中使用url_helpers

时间:2014-11-04 10:58:11

标签: ruby-on-rails

在我的rails应用程序中,lib类用于接收电子邮件。电子邮件接收器类解析电子邮件并使用HTTP响应将其发布到应用程序控制器。代码如下所示:

  uri = 'http://localhost:3000/incoming_mail'
  body = {'from'=> from, 'to' => to, 'subject' => subject, 'message' => message}

  response = Net::HTTP::post_form(URI.parse(uri), body)

问题是我不想指定完整的网址。有没有办法使用' incoming_mail_path'而不是' localhost:3000 / incoming_mail' ? 我试着添加:

include Rails.application.routes.url_helpers

但这不起作用,并给出以下错误:

 <class:EmailReceiver>': uninitialized constant EmailReceiver::Rails (NameError)

任何人都可以为此提出解决方案。

我在这里发布了整个类(用include语句更新了类):

require 'mail'
require 'net/https'
require 'net/http'
require 'uri'




class EmailReceiver 

  include Rails.application.routes.url_helpers
  attr_accessor :url
  def initialize
  end

  def submit(content)
    mail    = Mail.read_from_string(content)
    body    = mail.body.decoded
    from    = mail.from.first
    to      = mail.to.first
    subject = mail.subject


    if mail.multipart?
      part = mail.parts.select { |p| p.content_type =~ /text\/plain/ }.first rescue nil
      unless part.nil?
        message = part.body.decoded
      end
    else
      message = mail.decoded
    end

    unless message.nil?

      uri = incoming_mail_url
      #uri = 'http://localhost:3000/incoming_mail'
      body = {'from'=> from, 'to' => to, 'subject' => subject, 'message' => message}

      response = Net::HTTP::post_form(URI.parse(uri), body)

    end
  end


end

handler = EmailReceiver.new
handler.submit(STDIN.read)

2 个答案:

答案 0 :(得分:2)

调试:

阅读完你的评论后,我发现你将它作为一个甚至不能识别Rails的ruby脚本运行。

在确定如何将所有要求包含在文件中之前。我试图通过rails环境运行该文件(当服务器已经运行时):

cat sample.email | bundle exec rails runner "eval(File.read 'lib/email_receiver.rb')"

我收到incoming_mail_url的错误:

 Missing host to link to! Please provide the :host parameter, 
set default_url_options[:host], or set :only_path to true (ArgumentError)

incoming_mail_path成功执行/incoming_mail(这不是您需要的)。


结论:

这意味着无论你做什么,只要你不从服务器运行文件(例如:初始化程序),主机就永远不会存在。

当您从服务器运行此模块时,它会通过您所包含的route重新识别url_helpers


替代建议:

Griddler gem是一个Rails引擎,为将传入的电子邮件转换为HTTP POST请求的服务提供端点。它解析这些POST并将构建的电子邮件对象移交给您实现的类。

答案 1 :(得分:0)

要解决您的直接问题,您可能需要尝试取消包含您的include语句。现在似乎解释器认为“Rails”是EmailReceiver命名空间中的一个类。如果你将include ::添加到include语句,它应该引用顶层的“Rails”,这就是你想要的。

它应该可以工作,但是你的设置中可能还有其他错误导致你使用这个不必要的解决方法

修改 我的意思是添加“::”只是为了澄清

include ::Rails.application.routes.url_helpers