尝试使用邮件程序轨道4实现联系我们表单时的NoMethodError

时间:2014-02-25 02:12:37

标签: ruby-on-rails actionmailer nomethoderror

我对铁轨比较陌生,而且我正忙着把很多东西包裹起来。但现在主要是ActionMailer。我试图建立一个联系我们的表格。

我目前收到此错误

NoMethodError in ContactsController#new
private method `new' called for Contact:Class
  def new
      @contact = Contact.new
  end

这是我的邮件/ contact.rb

1 class Contact < ActionMailer::Base
2   default from: "my@email.com"
3
4
5   def contact_us(subject)
6     mail(to: 'my@email.com', subject: subject)
7   end
8
9 end

这是我的contacts_controller.rb

1 class ContactsController < ApplicationController
2   def new
3     @contact = Contact.new
4   end
5
6   def create
7     @contact = Contact.new(contact_params)
8   #Tell the contact model to send contact_us
9     if Contact.contact_us(subject).deliver
10       flash.now[:error] = nil
11       flash.now[:notice] = 'Thank you for your message!'
12     else
13       flash.now[:error] = 'Cannot send message.'
14       render :new
15     end
16   end
17 private
18  def contact_params
19   params.require(:contact).permit(:name, :email, :message)
20  end
21 end

最后这是观点

1 <%= form_for @contact do |f| %>
2   <p>
3     <%=f.input :name %>
4   </p>
5   <p>
6     <%=f.input :email %>
7     </p>
8   <p>
9     <%=f.text_area :message %>
10   </p>
11   <p>
12     <%= f.submit %>
13   </p>
14 <%end%>
15

我知道解决方案可能就在眼前。但如果可能的话,我真的很感激一些帮助。 如果我能为您提供其他任何内容,请告诉我。

1 个答案:

答案 0 :(得分:0)

您的代码中有一些不同的内容。首先,如果您从ActionMailer::Base继承,那么您正在创建一个Mailer类,而不是ActiveRecord模型。我会重命名该课程ContactMailer或只使用一个Mailer作为整个应用,并称之为Mailer。

这也是您无法拨打Contact.new的原因。如果您的Contact类继承自ActiveRecord::Base,则可以在模型上调用new并实例化该对象的实例。但是对于邮件程序,您正在定义类方法,每个方法都定义为发送特定的电子邮件。您永远不需要创建从ActionMailer继承的对象的新实例。

假设您有一个班级Mailer < ActionMailer::Base,并且在该班级中您有一个方法def contact_us(subject),您可以致电:

Mailer.contact_us(subject).deliver

发送电子邮件。