使用remote =>进行rails表单提交true - js文件呈现但不执行

时间:2013-12-17 07:09:43

标签: javascript ruby-on-rails

有一个类似的问题herehere,但我找不到答案。我也做了很多搜索“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中)导致它无法执行,所以实际上有两个问题。

2 个答案:

答案 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'}

希望这会有所帮助......