Ajax + Rails 不适用于 Heroku
Posted
技术标签:
【中文标题】Ajax + Rails 不适用于 Heroku【英文标题】:Ajax + Rails not working on Heroku 【发布时间】:2012-08-11 06:25:29 【问题描述】:我有一个弹出式登录表单,它通过 jQuery Ajax 在表单正文中显示错误消息。它在我的本地环境(PostGreSQL、WEBbrick)上运行良好,但在 Heroku 上运行良好。在 Heroku 上,用户被重定向到仅显示错误消息的新页面,即 "error":"Invalid Email Address: testing@test.com"
页面上其实有两种注册表单,一种是通过jQuery Dialog弹出的,另一种是嵌入到页面中的。感谢您的帮助。
这是控制器: 类 MailingListController
respond_to :json
def create
gb = Gibbon.new(Settings.mailchimp.api_key)
res = gb.list_subscribe(:id => Settings.mailchimp.list_id, :email_address => params[:email])
if res == true
render(:json => :body => "okay")
else
render(:json => :error => res["error"])
end
rescue
render(:json => :error => "Fatal Error")
end
end
这是 js(我知道,重复代码,我只是想让它工作):
// Mailing List Watcher
var mailingList2 = $("#mailing-list2");
if ( mailingList2.length )
mailingList2
.live("completed", function(e)
)
.live("success", function(e)
var that = this;
$.cookie("mailingListSubmitted", "true", expires: 7);
if(mailingList2.find("#mailing-list2 #status2").length == 0)
mailingList2
.find("form input[type='text']")
.after($("<div></div>").attr(id : "status2"))
mailingList2
.find("form input[type='text']")
.attr("disabled", true)
.fadeOut(5000);
$("#mailing-list2 #status2")
.text("Email submitted successfully!")
.effect("highlight", , 1000);
)
.live("failure", function(e, error)
if(mailingList2.find("#mailing-list2 #status2").length == 0)
mailingList2
.find("form input[type='text']")
.after($("<div></div>").attr(id : "status2"))
$("#mailing-list2 #status2")
.text(error)
.effect("highlight", , 1000);
)
.live("submittal", function(e, emailAddress)
if ( emailAddress == "" || emailAddress == null )
$(this).trigger("failure", ["You need to specify an email address!"])
return false;
var token = $.token();
$.post("/mailing_list", email: emailAddress, authenticity_token: token, function(response, status, xhr)
if(response.error)
$(mailingList2).trigger("failure", ["An error occurred: " + response.error]);
else
$(mailingList2).trigger("success");
, "json")
.error(function()
$(mailingList2).trigger("failure", ["An error occurred. Please try again in a few minutes."]);
);
);
mailingList2.find("form").submit(function()
emailAddress = mailingList2.find("input[name='email']").val();
$(mailingList2).trigger("submittal", [emailAddress]);
return false;
);
var mlSetting = $.cookie("mailingListSubmitted");
if ( mlSetting == "true" )
mailingList2.remove();
// Mailing List Watcher
var mailingList = $("#mailing-list");
if ( mailingList.length )
mailingList
.live("completed", function(e)
)
.live("success", function(e)
var that = this;
$.cookie("mailingListSubmitted", "true", expires: 7);
if(mailingList.find("#status").length == 0)
mailingList
.find("form input[type='text']")
.after($("<div></div>").attr(id : "status"))
mailingList
.find("form input[type='text']")
.attr("disabled", true)
.fadeOut(5000);
$("#status")
.text("Email submitted successfully!")
.effect("highlight", , 1000);
)
.live("failure", function(e, error)
if(mailingList.find("#status").length == 0)
mailingList
.find("form input[type='text']")
.after($("<div></div>").attr(id : "status"))
$("#status")
.text(error)
.effect("highlight", , 1000);
)
.live("submittal", function(e, emailAddress)
if ( emailAddress == "" || emailAddress == null )
$(this).trigger("failure", ["You need to specify an email address!"])
return false;
var token = $.token();
$.post("/mailing_list", email: emailAddress, authenticity_token: token, function(response, status, xhr)
if(response.error)
$(mailingList).trigger("failure", ["An error occurred: " + response.error]);
else
$(mailingList).trigger("success");
, "json")
.error(function()
$(mailingList).trigger("failure", ["An error occurred. Please try again in a few minutes."]);
);
);
mailingList.find("form").submit(function()
emailAddress = mailingList.find("input[name='email']").val();
$(mailingList).trigger("submittal", [emailAddress]);
return false;
);
var mlSetting = $.cookie("mailingListSubmitted");
if ( mlSetting == "true" )
mailingList.remove();
【问题讨论】:
你能发布错误的堆栈跟踪吗?该错误更多地与您的环境配置有关,而不是与 javascript 代码有关。 【参考方案1】:您的environments/production.rb 配置不正确,无法发送电子邮件。您需要确保将其设置为作为您实际拥有的域发送电子邮件。 Rails 和 Heroku 都有关于这个主题的好文章。
【讨论】:
实际上,同一页面上有两个几乎相同的注册表单,ajax 可以在一个上运行,而在另一个上不行。一个不起作用的是 jquery.ui 对话框,但除此之外它们是相同的,并且都在我的本地环境中起作用。【参考方案2】:答案就在这里,虽然我之前读过这篇文章,但我还是尝试了几次才能让它发挥作用:https://devcenter.heroku.com/articles/pgbackups#exporting-via-a-backup
【讨论】:
以上是关于Ajax + Rails 不适用于 Heroku的主要内容,如果未能解决你的问题,请参考以下文章