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 => true
内置到表单中。表单提交正常,更改记录在数据库中。是更新方法调用 update.js.erb 后调用的 javascript 不起作用。
发布您的更新控制器操作
【参考方案1】:
在您的$.ajax
调用中,确保将dataType
选项设置为"script"
,否则响应可能会以其他方式解释,因此不会作为JS 执行。
【讨论】:
完美答案!以防有人需要将它与button_to
一起使用:form: "data-type" => "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("<%= j render 'update' %>");
【参考方案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 5 和设计:如何在不更改默认策略的情况下禁用基于令牌的策略上的会话