Rails update.js.erb 不执行 javascript

Posted

技术标签:

【中文标题】Rails update.js.erb 不执行 javascript【英文标题】:Rails update.js.erb not executing javascript 【发布时间】:2013-09-27 00:20:36 【问题描述】:

我正在 Rails 中构建一个表单,它将通过 ajax 编辑现有问题。

提交表单并更新问题后,控制器中的update方法渲染update.js.erb,会再次隐藏表单。

我的问题是 update.js.erb 中的 javascript 代码根本没有执行。

我知道文件正在渲染,因为它显示在服务器输出中,并且当我放了一个

<% raise params %>

进入它,它起作用了。

然而,即使是最简单的

alert('hello');

在同一个文件中无效。

我已经排除了 javascript 和 jquery 配置问题,因为相同的代码在我的 edit.js.erb 文件中运行良好。它只是在 update.js.erb 中不起作用。

我错过了什么?

编辑:

Firebug 没有显示错误。这是 firebug 的网络面板中的响应:

alert('hello');
$('#question_body').replaceWith('<h4><p>jhsdfjhdsb k jdfs j fjfhds <strong>jfshaflksd;hf sdldfs l fdsalkhdfskhdfs</strong>;fd lfdksh hfdjaadfhsjladfhsjadfs ;df sjldfsj dfas hafdsj fdas ;ldfas ldfs df dl;hdf fdh ;fdj ;lfads</p></h4>');

定义更新

编辑 2:

这是控制器动作:

def update
  respond_to do |format|
    if @question.update_attributes(params[:question])
      format.html  redirect_to @question, :flash =>  :success => 'Question was successfully updated.'  
      format.json  head :no_content 
      format.js 
    else
      format.html  render action: "edit" 
      format.json  render json: @question.errors, status: :unprocessable_entity 
    end
  end
end

【问题讨论】:

在 firebug 的网络面板中查看响应。它显示了什么? 添加了对问题的回复。感谢您的观看。 显示您是否在表单中构建了 ajax?例如,如果您只是调用 $.ajax(..) 但对响应不执行任何操作,则不会执行任何操作,例如使用 jQuerys getScript (api.jquery.com/jQuery.getScript) 通过:remote =&gt; true 内置到表单中。表单提交正常,更改记录在数据库中。是更新方法调用 update.js.erb 后调用的 javascript 不起作用。 发布您的更新控制器操作 【参考方案1】:

在您的$.ajax 调用中,确保将dataType 选项设置为"script",否则响应可能会以其他方式解释,因此不会作为JS 执行。

【讨论】:

完美答案!以防有人需要将它与button_to 一起使用:form: "data-type" =&gt; "script" 【参考方案2】:

您使用的是haml 还是html.erb?如果是前者,那么这可能是解决方案:

respond_to do |format|
  ...
  format.js render layout: false
end

我遇到了完全相同的问题,很早就发现了这个问题,又花了一个小时左右的谷歌搜索在 *** 上找到了这个问题,这让我找到了这个问题:jQuery + Ajax + Haml. js.erb files not firing

【讨论】:

render layout: false 为同样的问题浪费了我 3 个小时。添加后,它工作正常。谢谢 经过几天的努力,这对我有用:) 谢谢 也在这里工作。但是为什么我在这里需要render layout: false?我已经在控制器文件的顶部指定了一个布局。我在几个地方使用过完全相同的模式(通过remote: true 提交并在create.js.erb 中修改页面),而之前从未使用过render layout: false 你是我的英雄【参考方案3】:

在您的 update.js.erb 文件中,无论您在何处执行 ruby​​ 代码,您都需要转义 javascript。

$('.container').empty().append('<%=
  escape_javascript(
    render 'update'
  )
%>')

这就是为我解决它的原因......

【讨论】:

您也可以使用j 转义javascript。示例:$('.container').html("&lt;%= j render 'update' %&gt;");【参考方案4】:

这个问题不仅仅是因为Controller方面。也可以在 View 方面,即您没有明确您的发布请求的数据类型。

确保在您的控制台中将请求视为 JS

参考:Similar issue

【讨论】:

【参考方案5】:

我遇到了同样的问题并找到了这个页面。我尝试了此处列出的方法,但没有找到运气。虽然后来以下方法解决了我的问题。

我原来的代码是:

$('#html_id').html('<%=@ruby_variable%>');

我将其更新为:

$('#html_id').html('<%=raw @ruby_variable.to_json%>');

现在它可以按预期工作了。

【讨论】:

耶稣,你是对的。知道为什么它会静默失败而不是抛出错误吗?【参考方案6】:

找出它是什么! ?(rails 4的解决方案)

如果您的 ajax 调用参数不在您的允许列表中,则记录将被保存,您不会收到有关“不允许”参数的错误消息,但 update.js.erb 不会运行 - 甚至虽然你的终端会反馈'Rendered update.js.erb etc'

如果额外参数是模型中的属性,请允许它。

允许非模型参数的最简单方法是在模型中添加:

  attr_accessor :paramKeyTroublesome

那么你也可以在控制器中允许它。

在 $ajax 调用中,数据需要正确地散列:

  data: model_name: paramKey1: value, paramKeyTroublesome: value

【讨论】:

【参考方案7】:

还有一个需要注意的问题是您的 update.js 文件中存在错误。如果有任何语法错误,则不会执行任何操作。您可以通过转到浏览器检查器并启用 Log XMLHttpRequests 然后查看输出 js 文件来检查这一点。

【讨论】:

以上是关于Rails update.js.erb 不执行 javascript的主要内容,如果未能解决你的问题,请参考以下文章

执行 Job 时 Rails ActiveJob SQS 和记录仍然不存在

为什么此代码块在Rails.cache.fetch之后执行

Rails 5 和设计:如何在不更改默认策略的情况下禁用基于令牌的策略上的会话

无法执行“rails db:*”之类的命令

Rails Asset Pipeline 预编译,如何正确执行?

如何每小时执行一个函数并将结果添加到 Rails 的数据库中?