0

我正在使用此 Railscast 在 Rails 3 中构建联系表格:http: //railscasts.com/episodes/326-activeattr?view=asciicast

我知道我做错的唯一一件事就是填写应该发送消息的位置。我使用以下代码发送消息:

mail(:to => "me@myemail.com") 

但是,这似乎不起作用,因为每次我提交表单时,都会收到此错误:

NoMethodError in MessagesController#create

undefined method `mail' for #<MessagesController:0x00000103734bd8>

Application Trace | Framework Trace | Full Trace
app/controllers/messages_controller.rb:10:in `create'

我应该用什么替换这条线来发送消息?

消息控制器.rb

class MessagesController < ApplicationController

  def new
    @message = Message.new
  end

  def create
    @message = Message.new(params[:message])
    if @message.valid?
      UserMailer.contact_message(@message).deliver
      redirect_to root_url, notice: "Message sent! Thank you for contacting us."
    else
      render "new"
    end
  end

end

user_mailer.rb

class UserMailer < ActionMailer::Base

def contact_message(message)
@message = message
mail(:to => "myemail@mymail.com", :subject => "New Message")
end

end

setup_mail.rb

ActionMailer::Base.smtp_settings = {
:address              => "smtp.gmail.com",
:port                 => 587,
:domain               => "mywebsite.com",
:user_name            => "myemail",
:password             => "secret",
:authentication       => "plain",
:enable_starttls_auto => true
}

ActionMailer::Base.default_url_options[:host] = "localhost:3000"
4

3 回答 3

0

我刚刚在这里回答了一个类似的问题:https ://stackoverflow.com/a/17883328/307308

from您的邮件方法中缺少该属性。

mail(:from => 'system@mymail.com', :to => "myemail@mymail.com", :subject => "New Message")
于 2013-07-27T02:52:17.920 回答
0

您的控制器上的邮件变量上没有创建任何对象。实际上,对于 Rails 上的用户 Mailer,您不必实例化变量,只需使用该方法调用您的 mailer。喜欢:

YourMailer.send(params)

你总是可以去 Rails 指南看看一些东西是如何工作的:http: //guides.rubyonrails.org/action_mailer_basics.html

于 2012-06-22T17:52:48.823 回答
0

您正在创建的 Message 对象只是一个可以在带有验证的表单中使用的对象。您仍然需要实际创建一个 Mailer 对象,并用您从 @message 对象获得的名称/电子邮件/消息填充它。

如果你创建了一个 Mailer(参见Episode 206 - Action Mailer),并且你会在创建一个之后在你的控制器中做这样的事情MessageMailer

def create
  if @message.valid?
    MessageMailer.contact_message(@message).deliver
    redirect_to root_url, notice: "Message sent! Thank you for contacting us."
  else
    render "new"
  end
end
于 2012-06-22T17:53:07.237 回答