如何使用nginx和capistrano在rails中正确部署静态和编译资产?

时间:2013-02-07 20:29:37

标签: ruby-on-rails ruby-on-rails-3.2 asset-pipeline rvm-capistrano

在我的项目中,我尝试将大多数js库捆绑到宝石中,以便在必要时可以更新和拉入,但是,我最近设置了我们的生产服务器并且我遇到了问题资产编制和/ public / assets中的静态资产。

具体来说,当我不使用资产管道时,我对数据表或我试图使用的任何其他JS库或css没有任何问题。我在生产中预编译我的资产,并使用典型的nginx设置(基于railscast#335)来为它们提供服务。

静态资产如下 -

公共/资产

javascript/jquery.formatCurrency-1.4.0.min.js
stylesheets/datepicker.css
twitter/bootstrap/bootstrap-datepicker.js

是公共/资产的正确位置吗?

当我使用capistrano进行部署时,这些资产在加载页面时会获得404,并且实际上并未复制到服务器上的/ public / assets目录中。

当加载其他页面时,我正在调用datatables插件,如下所示

$('#inventory_item_list_datatable').dataTable
  sDom: "<'row'<'span6'l><'span6'f>r>t<'row'<'span6'i><'span6'p>>",
  sPaginationType: "bootstrap",
  iDisplayLength: 100

数据表被编译到我的application.js中并且不会抛出错误,但该表实际上从未呈现过。我想知道这是否与编译所有内容的顺序有关?

应用程序/资产/ Javascript角/ application.js中

//= require jquery
//= require jquery_ujs
//= require jquery_nested_form
//= require twitter/bootstrap
//= require dataTables/jquery.dataTables
//= require dataTables/jquery.dataTables.bootstrap
//= require_tree .

应用程序/视图/布局/ application.html.erb

<%= stylesheet_link_tag    "application", :media => "all" %>
<link href="/assets/stylesheets/datepicker.css" media="all" rel="stylesheet" type="text/css" />

<%= javascript_include_tag "application" %>
<script src="/assets/twitter/bootstrap/bootstrap-datepicker.js" type="text/javascript"></script>

---编辑数据表问题

使用jquery-datatables-rails gem时,它必须是gemfile中资产组的OUTSIDE。

1 个答案:

答案 0 :(得分:1)

默认情况下,asset-pipeline附带3个用于放置资产的位置:app/assetslib/assetsvendor/assets。您必须放置(如果您想依赖管道)您的资产,而不是public/。在生产环境中,所有资产都被压缩并转换为一个文件(分别用于.js.css):application.*

编辑:在这种情况下,assets目录的结构不同。在与@theIV和@Kosmonaut聊天之后,我们找到了解决方案:将资产移动到vendor/assets目录,结构为:

对于Javascript资产:

 vendor/assets/javascripts/specific_javasripts

和CSS:

vendor/assets/stylesheets/specific_stylesheets

默认情况下,vendor/assets/目录不包含javascriptsstylesheets目录,应创建它们。