4

对于 Rails 3.1 应用程序,我的一些站点范围的 JavaScript 仅在满足某些实时、实例特定条件时才包含。这意味着我不能将它放在新资产管道的 application.js 中,因为 erb 没有为当前上下文中的嵌入式 Ruby 解析它。基本上,我根据登录的 current_user 包括键盘快捷键。

我的问题:这个带有嵌入代码的 JavaScript 应该去哪里,以便仍然使用正确的上下文(即当前的登录用户)为每个页面访问解析嵌入的 Ruby?

答案似乎只是将它放在底部的 application.html.erb 布局视图中,但这就像我将 JavaScript 代码隐藏在一个不直观的位置一样。

我尝试创建一个 application2.js.erb 文件,但随后出现有关未定义变量的错误,我认为这可能是因为资产引擎仅在缓存输出之前解析此文件一次,并且范围尚不正确current_user 之类的东西。

因此,使用 application.html.erb 在这里工作得很好,这不是如何让它正常工作的问题。相反,我想知道是否有一种更优雅的方法可以将资产管道模型与我的需求结合起来,并且仍然将我的大部分 JavaScript 保留在 assets/javascripts 目录中。

4

3 回答 3

0

您应该尝试创建 app/assets/javascripts/application2.js.erb (或您想出的任何更好的名称)

然后在你的 app/assets/javascripts/application.js 中加入这样的内容:

//= require application2

然后你可以拥有

<%= javascript_include_tag 'application2' %>

任何你想要的地方 - 例如在你的 application.html.erb 中。

顺便说一句,如果您想自定义按视图包含的内容,您可能会发现content_for很有用。看看这个截屏视频

于 2011-09-05T22:35:55.527 回答
0

正如一些人所指出的,这两种选择是:

  • 将您的 javascript 放在视图中(正如您所说,这感觉不太正确)。
  • 把它放在一个javascript文件中。如果满足某些条件,请在包含此 javascript 文件的视图中创建条件。

如果您需要将更多实例变量从控制器传递到您的 javascript,这个名为gon的 gem可以让您的生活更轻松。

这允许您使用以下 javascript 使用默认资产管道:

if(gon.conditional){
  //your embedded js code here
}

如果您想了解有关此宝石的更多信息,请查看此Railcast,其中所有内容都得到了解释。

于 2013-09-12T19:33:19.893 回答
0

好的,关于不显眼的 js。这只是一个概念(HAML):

在你看来某处

# hotkeys are "Ctrl+C", "Ctrl+A"
-current_user.hotkeys.each do |hotkey|
  %hotkey{ "data-key" => hotkey.key, "data-behavior" => hotkey.fn  }

然后在你的application.js

$(document).ready(function(){
  if($("hotkey").length > 0){
    $("hotkey").each{function(this){
      key = $(this).data("key");
      fn  = $(this).data("behavior");
      $(document).bind('keydown', key, fn);
    }}
  }
})

因此,同样的 JS 将从 HTML 热键数据中提取然后绑定它。

于 2011-09-07T07:16:39.293 回答