问题描述
|
新的Rails 3.1资产管道确实很棒,但是由于所有CoffeeScript(或JavaScript)文件都被合并为每个页面中包含的单个文件,因此引发了以下问题:
如何将脚本的执行限制为特定的控制器或动作?我的CoffeeScript中是否有办法知道在请求期间使用了哪个控制器和操作,以便可以在脚本中放入条件语句?
还是我完全以错误的方式走这条路?
解决方法
Trevor Burnham在这里很好地回答了这个问题:如何将CoffeeScript文件与视图关联?
他说:
有两种常见方法:
使行为取决于特定元素的存在。对于
实例,运行签单的代码
应该以类似的东西开头
if $(\'#signup\').length > 0
使行为取决于body
元素上的类。您可以
使用ERB设置身体类别。这是
通常是样式表所需要的
好。该代码将类似于
if $(\'body\').hasClass \'user\'
而且,如果您对CoffeeScript感兴趣,那么Trevor正在编写一本看起来非常不错的书:http://pragprog.com/titles/tbcoffee/coffeescript
,将coffeescript限制为特定视图的一种方法是为有问题的javascript创建自定义的链轮文件,格式类似于application.js。假设您将其称为extras.js。
// =需要my_code.js.coffee
然后使用javascript_include_tag \"extras\"
将代码包含在所需的视图中,方法是为这些视图创建自定义布局,或者使用content_for()
顺便说一句,您的问题是Rails管道迫使您将所有js资产放在一个文件中。这不是真的。这样通常可以避免多次往返,但是您可以拥有多个链轮文件。
,为什么不将特定控制器的javascript作为该控制器上的视图放置(如果它们如此具体,则它们对应于该视图)?
如果它们是普遍的笑话,则可以使用类,id或数据(html5)标记视图,并使javascript进行查找(以便您可以重复使用代码)。
,我通常要做的是在布局中的javascripts下包含yield:js,当我需要特定的脚本时,可以直接从视图加载它:
content_for :js do
javascript_include_tag \"myscript\"
end
,如果您在咖啡脚本中将gon gem用于变量,则可以使用以下模式:
在控制器中为每个动作放置一个标志:
def index
@gps_coords = GpsCoord.all
# Flag for the CoffeeScript to decide which part to run
gon.index = true;
end
def show
@gps_coord = GpsCoord.find(params[:id])
gon.lat = @gps_coord.latitude
gon.lon = @gps_coord.longitude
gon.show = true;
end
在相关的咖啡脚本中,使用这些标志来区分这两个动作:
# index action?
if gon.index?
first_coord = gon.gps_coords[0]
map.setView([first_coord.latitude,first_coord.longitude],15);
# show action?
if gon.show?
map.setView([gon.lat,gon.lon],15);