我在我的开发环境中工作。我想要的行为:我在模态对话框上有一个表单。用户单击提交,数据将发送到我的“问题”控制器。发送一些电子邮件,然后刷新对话框的内容以说“消息已成功发送”。很基本的。问题是我无法正确设置标头,因此rails将数据处理为html,而不是javascript。电子邮件发出但rails返回406错误。这是我的代码:
_social.html.erb
<div class='jqmWindow notices' id="emailModal">
<h3>Email a link to this poll</h3>
<p>You are emailing a link to the following poll:<br><strong><%=@question.text%></strong></p>
<%= form_tag(:controller=>'questions', :action=>'email' , :method => "post", :id=>"emailForm") do %>
<%= label_tag(:emails_label, "Enter up to 20 email addresses separated by commas:" )%>
<%= text_area_tag(:emails, "",:size => "60x6")%>
<%= hidden_field_tag(:question_id, @question.id )%>
<%= label_tag(:email_msg_label, "Enter a brief message to accompany your link:" )%>
<%= text_area_tag(:email_msg, "",:size => "60x4")%><br>
<%= submit_tag ( "Submit")%>
<%end%>
</div>
...
<script>
$(document).ready(function(){
$('#shareModal').jqm();
$('#emailModal').jqm();
$.ajaxSetup({
'beforeSend': function(xhr) {
xhr.setRequestHeader("Accept", "text/javascript")
}
});
$(document).ajaxSend(function(e, xhr, options) {
var token = $("meta[name='csrf-token']").attr("content");
xhr.setRequestHeader("X-CSRF-Token", token);
});
...
$('#emailForm').submit(function(){
$.post($(this).attr('action'), $(this).serialize(), null, "script");
return false;
});
});
</script>
questions_controller.rb
def email
question = Question.find(params[:question_id])
emails = params[:emails].split(/, /)
emails.each do |recipient|
GenericMailer.share(question, current_user.email, recipient, params[:email_msg]).deliver
end
respond_to do |format|
format.js
end
end
email.js.erb(现在,此代码永远不会被执行!)
alert("hello!");
$(#emailModal).html("Email sent successfully!");
以下是标题:
Request URL:http://127.0.0.1:3000/questions/emailForm/email?method=post
Request Method:POST
Status Code:406 Not Acceptable
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:172
Content-Type:application/x-www-form-urlencoded
__utma=96992031.1133215771.1353171766.1354190632.1354240040.26; __utmb=96992031.69.10.1354240040; __utmc=96992031; __utmz=96992031.1353379538.10.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=http://127.0.0.1:3000/questions/5
Host:127.0.0.1:3000
Origin:http://127.0.0.1:3000
Referer:http://127.0.0.1:3000/questions/1
User-Agent:Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
提前感谢您提供的任何帮助!
答案 0 :(得分:1)
感谢所有回复的人。事实证明,ajax代码从未被执行过。这是铁路问题。这是罪魁祸首:
<%= form_tag(:controller=>'questions', :action=>'email' , :method => "post", :id=>"emailForm") do %>
id被附加到请求中,而不是作为css id添加到表单标记中。因此,jQuery选择器没有捕获表单提交。正确的代码:
<%= form_tag({:controller=>'questions', :action=>'email' }, {:id=>"emailForm"}) do %>
...干杯
答案 1 :(得分:0)
看来你的ajaxSetup可能不正确,JS的官方MIME类型是application/javascript
在标题中,您可以看到Accept:
字符串中没有JS的内容。
首先尝试调用附加了.js
的URL来排除你的Rails控制器。
然后在浏览器检查器中确保application/javascript
在接受列表中排在第一位。
答案 2 :(得分:0)
您是否在email.js.erb中调试了javascript / jquery代码? 406错误通常表示你的js代码中的拼写错误(这对于错误代码的含义并不明显)。
至少,在您的示例中,第二行有拼写错误,缺少单引号:
$('#emailModal').html("Email sent successfully!");