在Rails插件中使用ActionMailer

时间:2010-08-16 06:56:16

标签: ruby-on-rails ruby-on-rails-plugins actionmailer

我正在尝试创建我的第一个Rails插件,并且在使用ActionMailer时遇到了一些麻烦。该插件只是收集用户反馈并通过电子邮件发送给定地址,因此在功能方面它并不太复杂......

所有功能在我的原始应用程序中完美运行,直到我决定插入这些东西。我一直在关注railsguide创建一个插件,你可以在这里找到我的整个插件源:

http://github.com/gshankar/rocket_feedback

虽然我很确定问题出在其中一个文件中:

1-加载所有内容的文件:rocket_feedback / lib / rocket_feedback.rb

require 'rocket_feedback/routing'
require 'action_mailer'

%w{ models controllers }.each do |dir|
  path = File.join(File.dirname(__FILE__), 'app', dir)
  $LOAD_PATH << path
  ActiveSupport::Dependencies.load_paths << path
  ActiveSupport::Dependencies.load_once_paths.delete(path)
end

2-调用deliver_feedback方法的控制器rocket_feedback / lib / app / controllers / rocket_feedback_controller.rb

class RocketFeedbackController < ApplicationController

  #Email method for feedback
  def send_feedback
      subject = params["subject"]
      from = params["email"]
      feedback = params["feedback"]
      RocketFeedback::deliver_feedback(from, subject, feedback)
      respond_to do |format|
        format.js { render :text => ''}
      end
   end
end

3-模型(继承自ActionMailer)

class RocketFeedback < ActionMailer::Base

  default_url_options[:host] = HOST

  def feedback(from, subject, feedback)
    @subject = "Feedback: #{subject}"
    @subject_for_message = subject
    @recipients = 'yourname@yourdomain.com' 
    @from = from
    @sent_on = Time.now
    @sent_at = Time.now.strftime("%d/%m/%Y, %I:%M:%S %p").to_s
    @body["sent_at"] = @sent_at
    @body["from"] = from
    @body["feedback"] = feedback
    @body["subject"] = @subject_for_message
    @headers = {}
  end

end

当我尝试通过插件发送反馈时,我遇到的唯一线索是此错误消息:

NoMethodError (undefined method `deliver_feedback' for RocketFeedback:Module):

先谢谢你的帮助! (请随意批评我的插件结构,这是我的第一次尝试,所以我确定我做错了各种各样的事情......)

1 个答案:

答案 0 :(得分:1)

您的插件中有RocketFeedback个类和RocketFeedback模块。 ActionMailer#deliver_foo动态方法是通过您的类定义的。您应该使用dot运算符调用类方法。

# Instead of this
RocketFeedback::deliver_feedback(from, subject, feedback)
# This should work
RocketFeedback.deliver_feedback(from, subject, feedback)