【问题标题】:rails form submission with remote => true -- js file renders but does not executerails form submit with remote => true -- js 文件呈现但不执行
【发布时间】:2023-03-26 22:34:01
【问题描述】:

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 中包装)导致它无法执行,所以确实存在两个问题。

【问题讨论】:

  • 你可以试试这个“format.js { render 'submit.js.erb' }”
  • 同样的事情 - 确认渲染,但 js 未执行。 ?
  • 使用 Startet 发送完整的日志条目...直到完成。否则很难发现问题。

标签: javascript ruby-on-rails


【解决方案1】:

这可能是因为返回的内容没有被评估。浏览器确实收到了文件但不知道如何处理它,您必须包含一些 JavaScript 来处理响应,如 here 所述:

不过,您可能不想只是坐在那里填写&lt;form&gt;。您可能想在成功提交后做一些事情。为此,请绑定到 ajax:success 事件。失败时,使用 ajax:error。看看吧:

你可以试试

$(document).ready(function(){
  $("#new_message").on("ajax:success", function (e, data, status, xhr){
     eval(xhr.responseText);
  });
});

为了评估js代码。

您可以阅读更多关于“数据远程”请求期间触发的事件here

编辑:忘了说,这个脚本必须包含在包含表单的 HTML 文件中。也许只需将其添加到您的表单下即可。

【讨论】:

  • 这很有帮助,可能会引导我找到解决方案,但现在永远不会调用 .on ajax:success 语句。我将其更改为 ajax:send,它被调用,但 js 仍然只呈现而不执行。上面的函数似乎也需要一些结束括号:) –
  • 您的回答最终让我找到了正确的解决方案,谢谢!
【解决方案2】:

这可能是由于返回的内容还包括您的默认布局。

试试这个:

format.js {render layout: 'no_layout', action: 'submit'}

希望这会有所帮助...

【讨论】:

  • 这导致 Rails 寻找布局“no_layout”但未能找到它。我尝试将语法更改为“render :layout => false, action: 'submit'”,但这与上面的效果相同(渲染了'submit',但不执行js)。
  • 这对我来说是一种享受(只是 { render layout: false })我过去不必使用它,但我似乎必须使用最新的 rails 4.1.4。
猜你喜欢
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多