Ruby sinatra应用程序中的资产管道

Ruby sinatra应用程序中的资产管道,ruby,module,sinatra,asset-pipeline,Ruby,Module,Sinatra,Asset Pipeline,我一直在尝试按照指南在sinatra应用程序中设置资产管道,目的是在加载网页时减少http请求 我想我在sinatra应用程序中创建一个模块时遇到了障碍,如果这是基本的,我很抱歉,但我以前没有这样做过 所以我创建了一个名为modules的文件夹,并在其中放置了一个assets.rb文件。我已经修改了脚本以满足我的需要 class Assets < Sinatra::Base configure do set :assets, (Sprockets::Environment.ne

我一直在尝试按照指南在sinatra应用程序中设置资产管道,目的是在加载网页时减少http请求

我想我在sinatra应用程序中创建一个模块时遇到了障碍,如果这是基本的,我很抱歉,但我以前没有这样做过

所以我创建了一个名为modules的文件夹,并在其中放置了一个assets.rb文件。我已经修改了脚本以满足我的需要

class Assets < Sinatra::Base
  configure do
    set :assets, (Sprockets::Environment.new { |env|
      env.append_path(settings.root + "/assets/js")
      env.append_path(settings.root + "/assets/css")

      # compress everything in production
      if ENV["RACK_ENV"] == "development || production"
        env.js_compressor  = YUI::JavaScriptCompressor.new
        env.css_compressor = YUI::CssCompressor.new
      end
    })
  end

  get "/assets/js/app.js" do
   content_type("application/javascript")
   settings.assets["app.js"]
  end

  get "/assets/css/app.css" do
   content_type("text/css")
   settings.assets["app.css"]
  end
end
my config.ru

require './david'
use Assets
run Sinatra::Application
在我的app.js和app.css中,我都放了

 // require_tree
但是在我的js文件中它是灰色的,而在css中它仍然是白色的

我已经安装了这两个gems,但在加载页面时仍然存在多个http请求,而不是将所有css和js分组为一个调用

有人能看到我遗漏的东西吗,主要是我猜测的模块设置

谢谢

编辑

我的当前布局文件

<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <title>David's Carpets</title>

 <!--stylesheets-->
 <%= stylesheet_link_tag "/assets/css/font-awesome.min.css" %>
 <!--[if IE 7]>
 <link rel="stylesheet" href="/assets/css/font-awesome-ie7.min.css">
 <![endif]-->    
 <%= stylesheet_link_tag "/assets/css/bootstrap.min.css" %>
 <%= stylesheet_link_tag "/assets/css/bootstrap-responsive.min.css" %>
 <%= stylesheet_link_tag "/assets/css/custom.min.css" %>
 <%= stylesheet_link_tag "/assets/css/resp-980.min.css" %>


 </head>
 <body onload="initialize()">
 <%= styled_flash %>


 <%= yield %>
 <%= erb :footer %>


<!-- Javascript -->
<script src="/assets/js/jquery-1.7-min.js" type="text/javascript"></script>
<script src="/assets/js/valid_mail.min.js" type="text/javascript"></script>
<script src="/assets/js/twitter.min.js" type="text/javascript"></script>
<script src="/assets/js/custom.min.js" type="text/javascript"></script>


</body>
</html>

大卫的地毯

我认为最好使用proc添加根路径:

set :assets, Proc.new { Sprockets::Environment.new(root) {|env|
  env.append_path File.join( root, "/assets/js")
  env.append_path File.join(root, "/assets/css")
  # more…
}}
看看这是否能改善情况。您可能需要使用
Pry
或只是
warn
来检查
settings.assets[“app.js”]
的值是否符合预期

权变措施 正如我在上面的评论中所说,事情并不总是很好地从一个框架映射到另一个框架。就个人而言,我使用并将我的资产预编译到。还有一些缩小库与I连接,然后使用或*指向视图/布局中的文件。我不喜欢将javascript组合成一个文件(YMMV)

我还想要Rails通过jQueryRails添加的jQuery内容,所以我写了,然后。你可能对它们感兴趣

另一种让链轮为您工作的方法是使用齿条。我发现这篇博客文章向您展示了如何:

  • 我还写了Sinatra Exstatic,它是Sinatra静态资产的一个分支。这是一个最新的叉子,如果您使用它,欢迎任何反馈:)

另外,既然问题中已经发布了模板:

Sinatra不会为您提供任何指向“超级”css/js文件的魔法,因此,如果您有多个css和javascript链接,那么客户端仍然会对单个文件发出多个请求。一种解决方法是(在JS的情况下)只有一条语句,例如:

<!-- Javascript -->
<script src="/assets/js/app.js" type="text/javascript"></script>

你想通过这个达到什么目的?有时,最好不要采用不同框架的方法,因为它不适合。与其专注于你想要的实现,也许我们可以专注于目标,然后你会得到更好的响应?嗯,我正试图在sinatra应用程序中实现资产管道的使用。这样我就可以更少的http请求来加载我的css和javascriptwell。现在,我已经将我所有的css放在一个样式表中,将我所有的js放在一个javascript文件中,但不是最优雅的方式,我昨天没能调查这件事。我知道这似乎是一个明显的问题,为什么你会想使用链轮,但它做了这么多,它有可能你不需要或想要一些方面。这些资产是否可以预编译到一个文件中?您是否可以提供调用资产的布局或视图?我将在下面发布我如何处理资产的答案,尽管我不使用链轮,以及上面的代码可能有什么问题。谢谢iain,我将发布布局文件谢谢iain。。我所做的基本上是这个,我的css也是一样,把所有的东西缩小成一个文件。。。就最佳实践而言,这样行吗?你会说,还是我只是在做资产管道会做的事情?如果你不介意的话,我还有一个关于gzip的问题,你所做的听起来不错。Sinatra和Rails之间的一个最大区别是,您必须完成Rails的一些工作,但是您还可以获得Rails所不具备的额外灵活性。在某种程度上,没有最佳实践,只有有效的方法:)我来看看另一个问题。
<!-- Javascript -->
<script src="/assets/js/app.js" type="text/javascript"></script>
  # The local variable `name` isn't used below
  # but just in case you ever need it, it's there
  get "/assets/js/:name.js" do |name|
   content_type :javascript
   settings.assets["app.js"]
  end