我试图设置一个简单的表单,用户在其电子邮件地址中键入以订阅简报。然后,我会收到一封包含用户电子邮件地址的电子邮件。
这是我到目前为止所尝试的:
表格:
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#订阅
答案 0 :(得分:1)
您可以在控制器内部获取发布数据,并将其作为参数传递给邮件程序操作。
编辑:上面的解决方案在这里工作。
<%= 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 %>
<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>
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
代替它。
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
Email: <%= @email %>
post '/subscribe' => 'welcome3#subscribe'
PS:
1)不要忘记生成邮件程序布局
app/views/layouts/mailer.text.erb
。
2)请记住,布局和视图的扩展取决于您在邮件程序中定义的内容类型。如果是文本(默认),则您具有扩展名.text.erb
的文件,如果是HTML,则该文件将具有.html.erb
。