如何捕获表单值并通过电子邮件作为ajax请求发送它们?轨道

时间:2017-07-30 02:17:08

标签: jquery ruby-on-rails ajax django forms

我试图设置一个简单的表单,用户在其电子邮件地址中键入以订阅简报。然后,我会收到一封包含用户电子邮件地址的电子邮件。

这是我到目前为止所尝试的:

表格:

  post 'subscribe/:email', :to => 'welcome3#subscribe', as: "email_subscribtion"

路线

class Welcome3Controller < ApplicationController
  def subscribe
    EmailMeMailer.confirmation().deliver
  end
end

控制器:

class EmailMeMailer < ApplicationMailer
    default from: "info@example.com"

  def confirmation
    @greeting = "Hi"

    mail to: "my_email_address@gmail.com", subject: "subscribtion confirmation"
  end
end

邮件:

$('#sub_form').submit(function(e) {
    e.preventDefault();
  }).validate({ 
    rules: {

      email: {
        required: true,
        email: true
      },

    },
    submitHandler: function (form) {

      var btn = $('#sub_btn');
      btn.button('loading');
      setTimeout(function() {
        btn.button('reset');
      }, 3000);

      $.ajax({
        type: 'POST',
        url: '/subscribe',
        // data: form.serialize(),
        dataType: 'json',
        async: true,
        data: {
          csrfmiddlewaretoken: '{{csrf_token}}',
          sub_email: $('#sub_email').val(),
        },

        success: function (json) {

          $('#sub_output').html(json.message);
          $("#sub_email").prop('disabled', true);
        }
      });

         return false; // for demo
     } 
 });

JQuery Ajax方法:

<h1>Welcome3#subscribe</h1>
<p>Find me in app/views/welcome3/subscribe.html.erb</p>

我坚持:如何捕获提交的电子邮件地址并将其发送给自己?我没有使用任何模型来保存数据。此外,根据this教程,Mailer无权访问POST请求。

请记住,我将Django应用程序转换为RoR,以便我可以在cPanel上部署它。您可以看到Django应用程序here:表单位于页脚中。

这是观点:

url: '/subscribe/'

data: {
    csrfmiddlewaretoken: '{{csrf_token}}',
    email: $('#sub_email').val(),
    },

编辑:

另外,在我的Django应用程序中,我发送到此URL:

submitHandler: function (form) {

    var btn = $('#sub_btn');
    btn.button('loading');
    setTimeout(function() {
      btn.button('reset');
    }, 3000);

    $.ajax({
      type: 'POST',
      url: '/subscribe/',
      // data: form.serialize(),
      dataType: 'json',
      async: true,
      data: {
        csrfmiddlewaretoken: '{{csrf_token}}',
        email: $('#sub_email').val(),
      },

      success: function (json) {

        $('#sub_output').html("Thanks");
        $("#sub_email").prop('disabled', true);
      }
    });

       return false;
    } 

如何在Rails中有所不同?

这是一起的JQuery Ajax请求

$(document).ready(function (e) {
   if ($('#fromLogin').val() == "True") {
      $('a#fancyLink').trigger('click');
   }
});  

编辑2:

在此阶段,当我点击订阅按钮时,我收到此路由错误:

  

路由错误没有路由匹配[POST]&#34; /&#34;

     

Rails.root:C:/ Sites / payligent

     

应用程序跟踪|框架跟踪|完整跟踪路径

     

路线优先从上到下匹配

     

帮助程序HTTP谓词路径控制器#操作路径/ URL路径匹配   root_path GET / welcome #index

     

package_signup_path GET /pricing/:level(.:format)welcome2#pricing

     

email_subscribtion_path GET /subscribe/:email(.:format)   welcome3#订阅

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以在控制器内部获取发布数据,并将其作为参数传递给邮件程序操作。

编辑:上面的解决方案在这里工作。

HTML:

<%= form_for :subscribe, html: { id: 'sub_form' } do |f| %>
  <input type="email" name="email" placeholder="Your email address" id="sub_email">
  <button class="btn btn-success" type="submit" id="sub_btn">Subscribe</button><br>
  <p id="sub_output" class="lead" style="color: white;"></p>
<% end %>

使用Javascript:

<script>
$('#sub_form').submit(function(e) {
  e.preventDefault();
}).validate({
  rules: {
    email: {
      required: true,
      email: true
    },
  },
  submitHandler: function (form) {
    $.ajax({
      type: 'POST',
      url: '/subscribe',
      dataType: 'json',
      async: true,
      data: {
        csrfmiddlewaretoken: '{{csrf_token}}',
        sub_email: $('#sub_email').val(),
      },
      success: function (json) {
        $('#sub_output').html(json.message);
        $("#sub_email").prop('disabled', true);
      }
    });

    return false;
  }
});
</script>

控制器(app / controllers / welcome3_controller.rb)

class Welcome3Controller < ApplicationController
  def subscribe
    EmailMeMailer.confirmation(params[:sub_email]).deliver_now

    respond_to do |format|
      format.json { head :ok }
    end
  end
end

PS:在v2.3.8之后,.deliver方法为deprecated。您应该使用.deliver_now代替它。

Mailer :( app / mailers / email_me_mailer.rb)

class EmailMeMailer < ApplicationMailer
    default from: "info@example.com"

  def confirmation(email)
    @greeting = "Hi"
    @email = email

    mail to: "my_email_address@gmail.com", subject: "subscribtion confirmation"
  end
end

邮件程序视图:(app / mailers / email_me_mailer.rb)

Email: <%= @email %>

路由:(config / routes.rb)

post '/subscribe' => 'welcome3#subscribe'

PS:

1)不要忘记生成邮件程序布局 app/views/layouts/mailer.text.erb

2)请记住,布局和视图的扩展取决于您在邮件程序中定义的内容类型。如果是文本(默认),则您具有扩展名.text.erb的文件,如果是HTML,则该文件将具有.html.erb