使用时会忽略咖啡脚本定义:remote => true和js.erb-responses

时间:2011-09-07 18:19:17

标签: ruby-on-rails ajax scope coffeescript assets

好的,请考虑以下事项: 一个app/views/pages/index.html.erb,包括:

<div id='content'>    
  <%= link_to 'Test', get_page_path('test'), :remote => true %>
</div>

app/controllers/pages_controller.rb中的定义如下:

def get
  @page = Page.new(:title => '404', :content => '<strong>Page not found</strong>') unless @page = Page.find_by_title(params[:title])
  respond_to do |format|
    format.html
    format.js
  end
end

app/assets/javascripts/pages.js.coffee中的javascript资源,如下所示:

bork = (swedish) -> alert swedish
$ ->
  bork 'bork bork'

最后是这样的app/views/pages/get.js.coffee

bork 'Smoerrebroed'
$('#content').html '<%= escape_javascript(@page.content).html_safe %>'

所以,这是有趣的部分 - 我确实按预期看到了'bork bork'警报。但是,点击链接后,只有内容被替换(如第二行所示),我没有看到“Smoerrebroed”警报。 显然包含pages.js.coffee内容 - 但在页面本身之外似乎无法访问。因此,区分化Rails所做的并不是非常有用 - 为什么我只能在特定脚本中访问我的'pages controller'特定内容到pages.js.coffee?有什么方法可以解决这个问题吗? 它似乎基于咖啡脚本将所有内容包装在

中的事实
(function() {
  //specific stuff here
}).call(this);

据说可以阻止脚本在页面加载之前执行。是否有某种方式告诉coffeescript停止这样做,因为我正在使用$ ->(简写)或$(document).ready()函数...

1 个答案:

答案 0 :(得分:4)

你说的是CoffeeScript函数包装器

  

据说可以阻止脚本在页面加载之前执行。

这实际上是今天第二次出现这种误解,所以我会指出你之前关于问题Coffeescript, Backbone and load order的回答。

要解决问题的主要部分:是的,可以关闭包装器(全局),但肯定不推荐。见How can I use option "--bare" in Rails 3.1 for CoffeeScript?

你应该做的是让bork成为一个全局函数。将其附加到window或作为简写使用@(因为this / @指向外部上下文中的window,即

@bork = (swedish) -> alert swedish

学习将函数包装器视为祝福而不是诅咒 - 这意味着如果您的团队碰巧在两个不同的文件中定义了名为bork的内容,它们将不会相互覆盖,除非它们是都明确地做了全球性的这不仅仅是一个CoffeeScript主义;在每个文件周围使用函数包装器以避免污染全局命名空间被认为是一种很好的JavaScript实践。例如,jQuery在每个several component modules中都会这样做。