1

我正在深入研究 Ruby on Rails,并且正在构建一个使用 Rails 3.2.8 的应用程序。我仍在学习使用资产管道,但我已经遇到了问题。我的 Javascript 文件由网站中的不同页面组织和命名(即 home.html -> home.js、parts.html -> parts.js),但我的 Rails 应用程序正在加载我的所有 Javascript 文件和我的一个Javascript文件正在崩溃,因为它引用了加载的页面(home.html)上不存在的元素......

"uncaught exception: jsobj.edit can't find div #parts_list"

根据在线文档,我在清单中包含了我的应用程序所需的所有 JS 文件......

//= require modernizr-latest
//= require jquery
//= require jquery_ujs
//= require home
//= require parts
//= require_tree .

...所以当我加载主页时,parts.js 文件被加载并执行并崩溃,因为主页上不存在parts_list div。

我的问题是...

  1. 我应该尝试在 Javascript 级别解决这个问题吗?如果是这样,怎么做?
  2. 或者我应该尝试在 Rails 级别修复它,并且只包含应该在任何给定时间运行的 Javascript 文件。同样,如果是这样,我该如何处理?
  3. 这似乎是一个相当普遍的问题。我没有正确使用 Rails 吗?

非常感谢您的智慧!

4

3 回答 3

4

要将特定 javascript 文件仅包含到特定视图页面中,您需要执行以下过程。

i)在资产文件夹中创建一个单独的文件夹,例如。'separate_view',里面放你的特定 js 和 css 文件。

ii) 在应用程序布局中为“separate_view”编写如下内容。
  <%= 产量 :separate_view %>

iii) 在您的目标模板中为“separate_view”写下以下内容。
  <% content_for (:separate_view) do %>
    <%= javascript_include_tag "xxx.js" %>
    <%= stylesheet_link_tag "xxx.css" %>
  <%end%>


以上内容适用于您的特定视图文件。

于 2012-12-01T05:52:04.750 回答
1

要回答您的问题:

  1. 您可以这样做,但这不是绝对必要的,您可以按视图加载资产,以便仅在需要时加载它们。关键是了解您已经获得的清单文件,以及何时加载。
  2. 是的,这样做。RailsCasts 第 279 集解释了资产的加载。它还涉及如何将您的资产分离出来,以便仅在您需要它们时加载。简短的版本是清单文件加载到您layout的 .
  3. 您正确地使用了 Rails,但是学习 AssetPipeline 对很多人来说是一个常见的,有时是陡峭的学习曲线。Railscast 的那一集,以及大量的练习,是我最好的推荐。
于 2012-12-01T03:16:07.733 回答
0
  1. 是的。您应该通过在脚本加载时不依赖 DOM 元素来解决这个问题。通常,脚本在页面顶部声明,因此它们在浏览器呈现任何 DOM 元素之前加载。如果您在脚本执行时依赖 DOM 存在,那么您肯定会遇到问题。相反,您应该通过将相关功能包装到方法/函数中并在$(document).ready上执行此函数或绑定live()事件来解决此问题

  2. 是的。您可以通过构建多个清单文件来解决这个问题(而不是默认包含一个巨大的 application.js)

  3. 这个问题通常通过(1)和(2)的组合来解决

于 2012-12-01T03:17:21.090 回答