将动态主题传递给 Rails mail_form

Passing dynamic subject to Rails mail_form

我正在使用 gem mail_form 处理 Rails 应用程序中的联系人,我有 6 种不同的联系方式。

我在表格中放了一个 hidden_field_tag 并将所需的主题作为变量传递。在 html 中,值在那里,但 到达的电子邮件带有(无主题)。我做错了什么?

在控制器中

def where_to_buy
   @contact = Contact.new
   @the_subject = "Where to buy"
end

在联系表中

= form_for @contact do |f|
  = render "form", f: f
  = f.text_area :message
  .hide
    = f.text_field :nickname, hint: 'Leave this field empty!'
    = hidden_field_tag    :mail_subject, @the_subject
  = f.submit "Send Message"

模型中

class Contact < MailForm::Base
  attribute :mail_subject
  attribute :first_name, validate: true
  attribute :last_name,  validate: true
  attribute :message,    validate: true
  attribute :nickname,   captcha:  true

  def headers
    {
      subject: %(#{mail_subject}),
      to:      "jorge@email123.com",
      from:    %("#{first_name} #{last_name}" <#{email}>)
    }
  end
end

在chrome中输出html:

<input type="hidden" name="mail_subject" id="mail_subject" value="Where to buy">

而不是:

= hidden_field_tag :mail_subject, @the_subject

您将要使用:

= f.hidden_field :mail_subject, value: @the_subject

如果您检查登录到 development.log 中的参数,您就会明白原因。

当您使用 hidden_field_tag 时,mail_subject 被定义为它自己的独立参数,不会包含在 contact 散列中。你会有这样的东西:

params = { "contact" => { "message" => "text here", ... }, "mail_subject => "Where to buy" }

但是当您使用 f.hidden_field 时,mail_subject 将包含在 contact 散列中。你会有这样的东西:

params = { "contact" => { "message" => "text here", "mail_subject => "Where to buy", ... } }

然后当您调用 Contact.new(params[:contact]) 时,新的联系人对象将获得 mail_subject 值。