Rails 3中的联系我们表单

11
我只需要在我的Rails应用程序中拥有一个联系我们的表单,其中包括姓名、电子邮件和消息字段,我不想永久保存这个消息,只想将其作为电子邮件发送到我的某个电子邮件帐户。你能帮助我吗?
谢谢!
3个回答

15
在Rails3中,您可以创建一个ActiveModel模型:
# /app/models/contact_us.rb
class ContactUs

  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming

  attr_accessor :name, :email, :message

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

  def persisted?
    false
  end
end

接下来是一个邮件发送程序:

# /app/mailer/contact_us_mailer.rb
class ContactUsMailer < ActionMailer::Base

  default :to => "your@address.com"

  def send(message)
    @message = message
    mail( :subject => @message.subject, :from => @message.email ) do |format|
      format.text
    end
  end
end

一个视图:

# /app/views/contact_us_mailer/sent.text.erb
Message sent by <%= @message.name %>
<%= @message.message %>

我没有完全测试过这段代码,但我只是想让你了解一下...


3
为什么这是最好的方式?为什么首先要为它创建一个模型?为什么不直接让"联系我们"表格提交到控制器上的"联系我们"操作,然后再触发邮件程序呢? - AdamT
这是一个很好的例子,只是不要使用“send”作为方法名称,因为它是一个保留关键字。拥有模型的原因是为了添加验证,所以您需要在控制器中使用valid?检查模型。 - John Glass

7
我已经编写了一个Rails引擎https://github.com/jdutil/contact_us,您可以轻松地将其放入任何Rails 3+应用程序中。我没有在表单中添加名称字段,但您可以fork这个仓库并修改它以满足您的需求。因为我想要一种简单的方法来连接人们现有的表单样式,所以它需要Formtastic gem。
要安装引擎,请将contact_us gem添加到您的Gemfile中:
gem 'contact_us', '~> 0.4.0'

运行bundle和安装rake任务:
$ bundle
$ bundle exec rake contact_us:install

然后只需修改在 /config/initializers/contact_us.rb 生成的初始化器,设置你想要表单提交发送到的电子邮件地址。


@jDutil 我们需要在环境配置文件中添加SMTP设置吗? - mrudult
您需要配置ActionMailer以按您的要求传递电子邮件。 Contact_us gem只提供了表单和发送程序,你需要自行配置应用程序的邮件发送方法。 - JDutil

3

1
链接失效。同时重定向到一个显示阴茎图案的页面,这不符合“适合工作场所”的定义,而工作场所是某人最可能搜索Rails联系表单的地方。谢谢。 - Dimitrios Mistriotis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接