为什么不从我的Rails unobtrusive js模板调用此方法

时间:2013-09-27 19:41:19

标签: ruby-on-rails ruby-on-rails-3 coffeescript asset-pipeline

我最近开始在我的Rails 3.2.14应用程序中使用CoffeeScript。目前我们所有的javascript代码都混杂在application.js中,它也充当了我们的清单文件。我们的计划是将这些内容提取到控制器特定的代码中,以便将来更容易维护。在我们的application_helper.rb文件中,我们有这个助手

def css_tag_id
  "#{controller.controller_name}-#{controller.action_name}"
end

我们将此用于特定于页面的CSS和JavaScript。所以我的第一步是获取与PostsController相关的代码并将其放入新文件posts.js.coffee中。我使用posts.js.coffee上的id检查body中的所有代码,以确保代码仅在PostsController呈现的视图上运行。这一切都被编译成一个大的application.js文件,这对我很好。这一切都很完美。

但是,在其中一个页面上提交的AJAX表单会在PostsController中生成一个呈现select_customer.js.erb的动作。在此模板中,它调用现在在posts.js.coffee中定义的方法,由于某种原因不再有效。

以下是所涉及的所有文件的一个小例子:

posts.js.coffee:

jQuery ->
  if $('#posts-new').length > 0
    keywordsAccordion()

keywordsAccordion = ->
  $('.accordion').accordion
    'active': 0,
    'collapsible': true

select_customer.js.erb

keywordsAccordion();

CoffeeScript是否正在编译posts.js.coffee以使其全部为命名空间或其他内容?我现在需要以不同的方式调用其中定义的方法吗?

我意识到这可能非常令人困惑,但如果有人可以帮助我,我将非常感激。

1 个答案:

答案 0 :(得分:1)

每个coffeescript文件都是命名空间,因此其功能仅在同一文件中可用。因此keywordsAccordion()只能在posts.js.coffee文件中访问。

您可以将这些功能附加到window对象,使其在任何地方都可用:

window.keywordsAccordion = ->
  ...

我相信您也可以使用@keywordsAccordion = ->,这是this.keywordsAccordion = ->的简写(this指的是全球范围)