【问题标题】:Rails contact form `undefined method`Rails 联系表“未定义的方法”
【发布时间】:2014-11-13 14:37:01
【问题描述】:

我正在尝试在 Rails 中构建一个联系表单,而不将邮件存储在我的数据库中。但是我在发送表单时收到了undefined method 'name' for nil:NilClass 错误。

我的消息控制器

def create
  @message = Message.new(message_params)
  if @message.valid?
    # TODO send message here
    Messages.new_messages_email(@mailer).deliver
    redirect_to root_url, notice: "Message sent! Thank you for contacting us."
  else
    redirect_to root_url, notice: "Something went wrong, try again!"
  end
end

private
def message_params
  params.require(:message).permit(
    :name, 
    :message,
    :email
  )
end

我的消息模型

class Message
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :name, :email, :message

  validates_presence_of :name
  validates :email, :email_format => {:message => 'is not looking good'}
  validates_length_of :message, :maximum => 500

  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end

  def persisted?
    false
  end
end

电子邮件正文

!!!
%html
  %body
    %p
      = @mailer.name
      Schreef het volgende:
    %p= @mailer.message
    %p= @mailer.email

在我的路线中,我有

  resources :messages

我忘记发布我的消息邮件

class Messages < ActionMailer::Base
  default from: "info@domein.nl"

    def new_messages_email(mailer)

    @mailer = mailer
    mail(to: 'peter@no-illusions.nl',
        subject: 'Iemand wilt contact met U')
    end
end

为了完成我的表格,

= form_for @message do |f|
  .field
    %br/
    = f.text_field :name, :placeholder => "Naam"
  .field
    %br/
    = f.text_field :email, :placeholder => "Emailadres"
  .field
    %br/
    = f.text_area :message, :rows => 5, :placeholder => "Uw bericht"
  .actions= f.submit "Verstuur bericht", :id => "submit"

在我的 MessagesController 中,我为 create 函数定义了参数,但是我做错了什么,忘记或忽略了导致错误的原因。

【问题讨论】:

  • `Messages.new_messages_email(@mailer).deliver` 在这一行你使用@mailer,你的意思是@message,你还没有定义@mailer,除非它在别处跨度>
  • 你确定你的视图中有form_for @message吗?

标签: ruby-on-rails contact-form


【解决方案1】:

在你的控制器中应该大概是:

Messages.new_messages_email(@message).deliver # not @mailer

除此之外,您必须在邮件中重新初始化@message,例如:

class Messages < ActionMailer::Base

  def new_messages_email(msg)
    @message = msg
  end

end

【讨论】:

  • 这是正确答案,但您可以使用@message = msg
  • 为什么是msg.id?我没有将消息保存到模型中,因此没有 id。使用Message.new 似乎可以解决问题。
  • 彼得,按照@Зелёный 的建议去做。我曾经使用延迟邮件,但它们的工作方式略有不同。
  • 是的。似乎一路上混淆了我的命名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多