在Rails应用程序中拆分Javascript或Coffeescript的最佳方法是什么?

时间:2012-03-01 14:22:41

标签: javascript ruby-on-rails-3 coffeescript

假设我有一个带有资源的rails应用程序 - 用户。我有javascript应该可用于任何服务的页面。我有javascript应该可用于在User下提供的任何页面。我有用户可以使用的每个特定操作的javascript。在Rails 3.1及更高版本中,是否有一种简单的方法可以确保我的Javascript仅适用于需要它的页面?那个coffeescript呢?

1 个答案:

答案 0 :(得分:0)

我认为来自Bob的关联项目是相关的(有关于性能与加载文件数量之间的权衡的评论),但我看到的问题更多是关于名称间距,范围和结构。

要专门回答这个问题(并假设您正在使用jQuery),请考虑以下CoffeeScript:

$ ->
  doSomething()
  doSomethingElse("#some-element")

doSomething = ->
  alert("I'm doing something")

doSomethingElse  = (selector) ->
  alert("I'm hiding something")
  $(selector).hide()

CoffeeScript编译器将在匿名函数中包装所有这些内容,因此只能在加载页面的上下文中使用(脚本标记,控制器特定文件或全局application.js)能见度)。

有几种模型需要考虑。一个简单的方法是遵循具有特定于模型的“事物”的模式,以及通常有用的(全局)模式。因此,如果我想要一个特定于用户的javascript函数,那么它将进入app/assets/javascripts/users.js.coffee,否则它需要是全局的(在application.js.coffee中)。

rails-backbone gem提出了一个更加完整和复杂的解决方案,它有一些生成CoffeeScript模型,视图,模板和路由器的生成器,可以取代我们通过常规rails generate scaffold foo获得的许多内容。 - 相同类型的CRUD操作以完全不同的方式完成,特别是模板(嵌入式javascript)与ERB模板非常相似。对我来说,这更像是一种信念的飞跃。

无论是在应用程序范围的文件中,还是在特定于控制器的一个或多个文件中,在任何一种情况下,Asset Pipeline都会将所有代码放在一起并将其全部发送给用户(假设您保留默认配置),但这是一个单独的主题。

不确定这是否回答了问题,但我认为区分资产管道的资产交付执行是很重要的。 javascript,这是一个范围问题,CoffeeScript做得非常好,而且backbone.js更进一步。