【问题标题】:Configuring comment form in Rails在 Rails 中配置评论表单
【发布时间】:2016-01-17 17:13:29
【问题描述】:

我继承了一个静态网站,主页上有一个典型的联系表单,其中包含姓名、电子邮件、电话和消息,并且应该在提交时将电子邮件发送到设置的电子邮件地址。下面的 JS 和 Slim 部分是给我的。我现在正在尝试使用 ActionMailer 连接到 Rails,但我在表单参数和/或电子邮件对象的构建方面做错了。我不希望将其存储在数据库中(尝试使用和不使用模型)。

路线: resources :contacts, only: [:new, :create]

_contact_form.slim

(我改变的只是action 值)

form#contactform.form-horizontal action="/contacts" method="post" name="contactform" role="form"
        /! Field 1
        .row
          .col-md-6
            h3 name:
            .input-text.form-group.left-field
              input.input-name.form-control name="contact_name" type="text" /
          .col-md-6
            h3 Phone:
            .input-text.form-group
              input.input-name.form-control name="contact_phone" type="text" /
        /! Field 2
        h3 Email:
        .input-email.form-group
          input.input-email.form-control name="contact_email" type="email" /
        /! Field 3
        h3 Message:
        .textarea-message.form-group
          textarea.textarea-message.form-control name="contact_message" rows="7"
        /! Button
        button.btn.btn-default type="submit"
          | Submit
          i.flaticon-arrow209

Javascript:

(我设置了url并添加了beforeSend

  /* --------------------------------------------
Contact Form
-------------------------------------------- */
$(function($) {
    $('#contactform').bootstrapValidator({
        message: '',
        feedbackIcons: {
            valid: 'glyphicon glyphicon-ok',
            invalid: 'glyphicon glyphicon-remove',
            validating: 'glyphicon glyphicon-refresh'
        },
        fields: {
            contact_name: {
                validators: {
                    notEmpty: {
                        message: ''
                    }
                }
            },
            contact_email: {
                validators: {
                    notEmpty: {
                        message: ''
                    },
                    emailAddress: {
                        message: ''
                    }
                }
            },
            contact_message: {
                validators: {
                    notEmpty: {
                        message: ''
                    }
                }
            }
        },
        submitHandler: function(validator, form, submitButton) {
            $('.contact-form').addClass('ajax-loader');
            var data = $('#contactform').serialize();
            $.ajax({
                type: "POST",
                url: "/contacts",
                beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
                data: $('#contactform').serialize(),
                success: function(msg) {
                    $('.contact-form').removeClass('ajax-loader');
                    $('.form-message').html(msg);
                    $('.form-message').show();
                    submitButton.removeAttr("disabled");
                    resetForm($('#contactform'));
                },
                error: function(msg) {
                    $('.contact-form').removeClass('ajax-loader');
                    $('.form-message').html(msg);
                    $('.form-message').show();
                    submitButton.removeAttr("disabled");
                    resetForm($('#contactform'));
                }
            });
            return false;
        },
    });
    function resetForm($form) {
        $form.find('input:text, input:password, input, input:file, select, textarea').val('');
        $form.find('input:radio, input:checkbox').removeAttr('checked').removeAttr('selected');
    }
});

contact.rb

class Contact

  include ActiveModel::Model
  include ActiveModel::Conversion
  include ActiveModel::Validations

  attr_accessor :contact_name, :contact_phone, :contact_email, :contact_message

  validates :contact_name, :contact_email, :contact_message, presence: true

end

contacts_controller.rb:

class ContactsController < ApplicationController

  def create
    @contact = Contact.new(contact_params)

    if @contact.valid?
      ContactMailer.contact_email(@contact).deliver
      redirect_to new_contact_path, notice: "Thank you for your message."
    else
      flash[:alert] = "An error occurred while delivering this message."
      render :new
    end
  end

private

  def contact_params
    params.require(:contact).permit(:contact_name, :contact_phone, :contact_email, :contact_message)
  end

end

contact_mailer.rb

class ContactMailer < ActionMailer::Base

  default to: "me@myemailaddress.com"

  def contact_email(contact)
    @contact = contact

    mail(from: email: @contact.contact_email, body: @contact.contact_message)
  end

end

contact_email.text.slim

| New contact

= @contact.contact_name 
= @contact.contact_email 
| wrote:

= @contact.contact_message

Rails 服务器的当前输出

我目前在@contact 对象的contact_mailer.rb 中遇到语法错误,但在此之前,Rails 服务器日志告诉我Contact 对象未初始化。我试过包括form_for/form_tag Rails 助手,但这似乎没有帮助。我还为HomeController 的联系人添加了索引操作,并在其他地方阅读了此建议。

我可以继续玩“更改错误消息”,但我想我遇到了一些根本性的错误(仍然是 Rails 新手),所以非常感谢任何指针。我已经阅读了 ActionMailer 文档以及我能找到的所有其他内容。

【问题讨论】:

  • 问题与javascript没有直接关系。正在删除该标签

标签: ruby-on-rails ruby forms


【解决方案1】:

在你的contact_mailer.rb调用之后你需要有.deliver,不是吗?

另外,在你的contact.rb中尝试添加

after_create :send_email

private 
def send_email
    ContactMailer.contact_email(self).deliver
end

【讨论】:

  • 我能找到的所有示例都将交付(或deliver_now)链接到contact_mailer 调用。另外,after_create 无法识别,我认为是因为我没有从 ActiveRecord::Base 继承(因为不希望将表单数据存储在数据库中)。
猜你喜欢
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 2011-04-09
  • 2015-06-22
  • 1970-01-01
相关资源
最近更新 更多