Ruby On Rails 3.1 – 资产管道 – 资产呈现两次

大更新

当我终于找到真正的解决方案时,我也发现了真正的问题。 正如我在这里写下了很多无用的信息,考虑到真正的问题,我正在对问题进行大量更新,以便其他人可以轻松找到正在发生的事情,并且可以看到解决方案。

问题 :这是因为Rails 3.1的资产管道

实际上……这很简单:资产在开发环境中呈现两次。 做了很多调查,我发现我的Rails 3.1服务器正在从“app / assets”和“public / assets”文件夹中呈现资产。 所以,我把每个.js和.css文件都复制了,这打破了我所有的javascript动画(是的……绑定两次相同的事件和处理程序到同一个元素不是你想要的……通常)。

如果问题突然出现,那是因为我必须运行“rake assets:precompile”来部署我的应用程序。 从那时起,当我的应用程序在开发中运行时,服务器正在呈现静态预编译资产和动态预编译资产。

解决方案(现在有一个更好的几行) – 但你仍然可以阅读它

第一个:我只需要从公共文件夹中删除所有预编译资产。

更好的一个:将config.serve_static_assets = false添加到development.rb,这将阻止从/ public / assets加载文件。 另外,不要忘记重置浏览器缓存。

[编辑:2012年7月20日]

高级一:由于这些静态资产,我最近遇到了一个新问题。 您知道,当您使用paperclip或其他某些gem时,他们会将您的图像添加到某个系统子文件夹的公共文件夹中,因为如果您想使用capistrano部署应用程序,则会更好。 嗯,那太好了,但是! 当我们添加config.serve_static_assets = false时,这些图像不会在开发中呈现,如果你想对它们做一些css则不好。 所以! 该怎么办?

事实上,你必须像开发一样开启静态资产:

# Expands the lines which load the assets config.assets.debug = true config.serve_static_assets = true 

然后,为防止rails两次渲染其他资源(预编译的资源),只需执行以下命令:

 rake assets:clean 

它与rake资产相反:precompile并将清理你的public / assets文件夹,这样Rails就不会再渲染你的资产两次了。 当然,每次预编译它们时,您仍然需要清理浏览器缓存并清理资产。

[编辑:2013年11月18日] – 来自@idejuan的回答

另一种方案:

你可以添加这一行:

config.assets.prefix = '/dev/assets'

对于development.rb,前缀可以是你想要的任何东西。 脚本将不再加载两次,并且将读取/ public / system中的图像! 但要小心,因为它改变了你的“静态”资产的路径……如果你需要来自gem的资产,它可能无法在开发中正确加载它们……

[结束编辑]

剩下的问题有答案!

那么,为什么我的开发应用程序正在渲染静态预编译资产?

实际上,如果您预先编译资产,则默认情况下,rails会在开发和测试环境中从公用文件夹和资产文件夹中呈现资产。 通常来自公用文件夹的资产应该覆盖来自assets文件夹的资产,但情况并非如此,即使这样,我们也会失去“debug_mode”的好处,因为我们每次都必须预先编译资产。 因此……在开发和测试环境中进行本地预编译时,资产会呈现两次。

因此,通过在development.rb文件中添加“config.serve_static_assets = false”,您可以以某种方式覆盖告诉Rails在公共文件夹中查找资产的默认行。 我希望有一天他们会做一些关于本地预编译资产的事情。

感谢那些帮助我进行调查的人:)

Kulgar。

你可能想看一下

https://stackoverflow.com/a/7854902/686460

“将config.serve_static_assets = false添加到development.rb将阻止从/ public / assets加载文件”

我认为这是一个比你在这里提出的更好的解决方案。

我有同样的问题,并找到了一个简单的解决方案/黑客。 我刚添加了这一行:

 config.assets.prefix = '/dev/assets' 

到development.rb,前缀可以是你想要的任何东西,我把/ dev / assets放在一起以避免进一步混淆。

脚本不再加载两次,我可以使用我在/ public / system中的图像,当我尝试config.serve_static_assets = false的解决方案时无法读取

到目前为止,我还没有发现这个解决方案的缺点。 希望它也适合你!

我不明白为什么Ubuntu升级会与你的JavaScript有任何关系。 你在使用静态JavaScript吗? 动态JavaScript? CoffeeScript的? 如果后两者中的一个,我认为升级可能会破坏处理你的JS的工具之一……

有些事要尝试:

  • 在浏览器中查看JavaScript源代码。 确保相同的源代码到达您的浏览器。
  • 尝试在另一个系统上运行Rails应用程序(可能安装另一个具有不同Ubuntu版本的VM,看看是否可以复制问题)。
  • 确保在两个地方完全相同的应用程序代码版本。

我还建议您运行rails服务器,将其传递给不同的环境。 这可能与您为开发设置的环境设置有关。

 rails server -e production 

如果问题消失,则必须使用“开发环境”的配置设置。