有一个类似的问题here和here,但我找不到答案。我也做了很多搜索“rails format.js render”而无法解决这个问题。
在Rails 4中,我有一个经过验证的表格如下:
<%= form_for(@message, :remote => true) do |form| %>
// don't want to call the js on submit here because
// I don't want it to execute if the form did not validate
我在控制器中调用js:
def create
@message = Message.new(params[:message])
if @message.valid?
NotificationsMailer.new_message(@message).deliver
respond_to do |format|
format.js { render "submit" }
end
else
render :new
end
end
我在“messages”文件夹中有“submit.js.erb”:
alert('js was called!');
当我提交表单时,终端验证文件是否呈现:
Rendered messages/submit.js.erb (0.5ms)
...但是在屏幕上, 没有任何反应。 没有提醒,也没有执行javascript。我还尝试创建“submit.html.erb”并将我的javscript包装在脚本标记中,同样的事情发生了 - 文件加载,但脚本没有执行。
为什么呢?告诉Rails执行js需要做什么?
编辑:在访问Kelvo的资源并尝试了很多事情后,答案似乎是将其添加到application.js ...
$.ajaxSetup({
'beforeSend': function (xhr) {xhr.setRequestHeader('Content-Type', 'application/javascript');}
});
事实证明,在我的实际“submit.js.erb”中手动换行和缩进(因为它没有包装在我的IDE中)导致它无法执行,所以实际上有两个问题。
答案 0 :(得分:3)
这可能是由于未评估返回的内容。浏览器确实收到了该文件,但不知道如何处理它,您必须包含一些JavaScript来处理响应,如here所述:
尽管如此,你可能不想只是坐在那里填充
<form>
。您可能希望在成功提交后做一些事情。为此,请绑定到ajax:success事件。失败时,使用ajax:error。看看:
在你的情况下你可以尝试
$(document).ready(function(){
$("#new_message").on("ajax:success", function (e, data, status, xhr){
eval(xhr.responseText);
});
});
为了评估js代码。
您可以阅读有关“数据远程”请求here
期间触发的事件的更多信息编辑:忘记提及,此脚本必须包含在包含该表单的HTML文件中。也许只需将其添加到您的表单下即可。
答案 1 :(得分:1)
这可能是由于返回的内容也包括您的默认布局。
试试这个:
format.js {render layout:'no_layout',action:'submit'}
希望这会有所帮助......