如何将CoffeeScript(或JavaScript)执行限制在Rails 3.1中的特定控制器和操作?
新的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创建自定义sprockets文件,其格式类似于application.js。 假设你称之为extras.js。
// =需要my_code.js.coffee
然后使用javascript_include_tag "extras"
将代码包含在所需的视图中,方法是为这些视图创建自定义布局,或者使用content_for()
顺便说一句,您的问题表明rails管道强制您将所有js资产放在一个文件中。 这不是真的。 这通常有效避免多次往返,但您可以拥有多个链轮文件。
为什么不把特定控制器的javascript作为一个视图放在这个控制器上(因为它们对应于那里是否如此具体)?
如果它们是普通的enaugh,您可以使用类,ID或数据(html5)标记您的视图,并使您的javascript查找(因此您可以重用您的代码)。
我通常做的是获得一个yield:js在我的布局中的javascripts下,当我需要一个特定的脚本时,我直接从我的视图加载它:
content_for :js do javascript_include_tag "myscript" end
如果您在咖啡脚本中使用gon gem用于vars,则可以使用以下模式:
为控制器中的每个操作添加一个标志:
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);
- 如何配置Rails 3.2 + / 4以生成.js而不是.js.coffee默认情况下?
- 条带令牌未携带到控制器导轨4
- ruby on rails //如何使用咖啡。 而不是我的项目中的js?
- 在rails资产管道中的js.coffee文件中使用erb时出错
- ExecJS咖啡脚本没有显示编译错误的行号(Rails资产管道)
- Rails 4 jQuery,javascript和咖啡脚本无法正常工作
- CoffeeScript – 无与伦比的外观
- Rails 3.1。 如何防止Rails使用CoffeScript?
- Backbone和Rails关联:避免JSON HashWithIndifferentAccess错误