在我的rails应用程序中,似乎所有.js.coffee文件都被加载到每个页面,无论如何。我遇到的问题是正在加载locations.js.coffee文件,然后在函数中返回一个空值,因为locations.js.coffee文件正在查找的表不存在于任何其他页面上不是位置页面。
注意:在每个文件中:users.js.coffee,locations.js.coffee和campaigns.js.coffee我分别放置了行.log(&#34; users.coffee)已加载&#34;),console.log(&#34; locations.coffee已加载&#34;)和console.log(&#34; campaigns.coffee加载&#34;)以查看它们是否已加载 < / p>
例如,刷新位置页面会成功输出到控制台:
但冒险到用户或广告系列页面会尝试加载文件locations.js.coffee,但由于用户或广告系列中不存在locatrions.js.coffee所依赖的ID为#restaurantLocations
的表格,结果错误是:
对于文件locations.js.coffee中的行table.columns().eq(0).each (colIdx)
。
如何防止此错误或仅允许为正确的页面加载正确的文件并阻止其他文件加载?
(剩余的locations.js.coffee代码):
jQuery ->
console.log("locations.coffee loaded")
# Setup - add a text input to each footer cell
$("#restaurantLocations tfoot th").each ->
title = $("#restaurantLocations thead th").eq($(this).index()).text()
$(this).html "<input type=\"text\" placeholder=\"Search " + title + "\" />"
# DataTable
table = $("#restaurantLocations").DataTable()
# Apply the search
table.columns().eq(0).each (colIdx) ->
$("input", table.column(colIdx).footer()).on "keyup change", ->
table.column(colIdx).search(@value).draw()
# Hiding the id column, but for use for data manipulation
table.column( 0 ).visible( false )
# Allowing multi-select
$("#restaurantLocations tbody").on "click", "tr", ->
$(this).toggleClass "selected"
# Allowing deletion (works)
$("#deleteLocations").click ->
multiSelected = table.rows(".selected").data()
table.rows(".selected").remove().draw false
for locationSelected in multiSelected
id = locationSelected[0]
$.ajax({
url: "/locations/" + id, # Note: $.ajax setup works as setting /locations/(id number) will allow deletion
type: "post",
dataType: "json",
data: {"_method":"delete"}
})
# Conditional 'Select All' (works)
$("#selectAllLocations").click ->
table.$('tr', {"filter":"applied"}).addClass "selected"
# Deselecting all (works)
$("#deSelectAllLocations").click ->
table.$("tr").removeClass "selected"
答案 0 :(得分:1)
默认情况下,Rails包含app/assets/javascripts/application.js
的文件,该文件需要app/assets/javascripts
中的所有其他文件。然后,默认应用程序布局包括该文件。
还有其他方法可以整理您的资产,包括controller-specific assets。这些都需要自定义资产配置。
但是,我不建议这样做。如果您能够以可以包含在每个页面上的方式编写JavaScript,并且不在不需要的页面上执行任何操作,那就更好了。
有很多方法可以实现这一点:一个简单的方法是使用jQuery在页面主体上或页面上的其他位置查找特定的类。
在上面的代码中,您需要做的只是将if $("#restaurantLocations").length > 0
包裹在整个事物中(但在jQuery
回调函数内)。
这给你带来了一些好处:
阅读The Asset Pipeline Rails Guide,了解有关资产如何在Rails中运行的详细信息。