Rails在视图之间共享javascript

时间:2012-10-06 00:50:54

标签: javascript ruby-on-rails-3 views coffeescript code-duplication

在我的rails应用程序中,我有一段javascript在我的8个视图中的2个之间完全重复。这个地方javascript的适当位置在哪里?

rails应用程序结构将javascript放在app/assets/javascripts中,其中每个模型都有一个js.coffee文件和一个application.js文件。我将它放在application.js文件中还是有一种方法可以在两个.js目录之间共享javascript?

由于

2 个答案:

答案 0 :(得分:1)

<强>更新

我完全误解了这个问题,并认为这是关于backbone.js视图,而不是rails视图。下面的答案实际上与所要求的不同......也许它与使用backbone.js的人有关,但它并没有真正回答这个问题。对不起!

原始回答

我分享代码的方法是创建一个父类,包含我想在那里共享的代码,然后让每个使用它的视图扩展该类(在coffeescript术语中)。

所以(再次在coffeescript中):

app / assets / javascripts / base_view.js.coffee (或您想放置的任何地方)

class App.BaseView
  sharedFunction: () ->
    ...

然后使其他视图扩展App.BaseView(或者你称之为父类的任何视图):

应用/资产/ Javascript角/视图/ view2.js.coffee

class App.MyView1 extends App.BaseView
  ... sharedFunction() ...

应用/资产/ Javascript角/视图/ view2.js.coffee

class App.MyView2 extends App.BaseView
  ... sharedFunction() ...

只需确保在App.BaseView中的其他观看次数之前加载了包含application.rb的文件。 (如果你使用的是require.js,那么加载顺序当然不重要,但我假设你不是。)

另外作为一个注释,虽然你提到你只是分享“一段javascript”,但从一开始就考虑共享模块真的更好,所以如果以后你想扩展那个“片段” javascript“你有框架来做到这一点。这是关于使用backbone.js实现模块的a good article

FWIW,this is the project我正在研究与常见视图类共享代码的位置:App.Threads扩展App.TranslatableFieldsView扩展App.BaseView。请注意,我正在使用coffeescript的super共享初始化代码。我为模特做同样的事情。

答案 1 :(得分:1)

我的观点是将javascript保留在资源中,并在需要的地方使用javascript_include_tag包含它 例如,您已将公共代码放在assets/mycode.js.cofeee

在你需要的html中像这样使用它

javascript_include_tag('mycode')

由于