我在我的Rails 3.1应用程序上使用CloudFlare CDN.Cloudflare是一个在DNS级别工作的CDN.在第一次打到静态资产时,CloudFlare会从您的应用程序加载它,然后将其缓存在CDN中.从CDN而不是您的应用程序加载该资产的未来请求.
我遇到的问题是,如果将控制器缓存设置为true:
config.action_controller.perform_caching = true
Run Code Online (Sandbox Code Playgroud)
它启用了Rack :: Cache中间件.由于Rails为静态资产设置了默认缓存控制设置,因此这些资产将写入Rails.cache存储.结果,我的缓存存储(在我的情况下是redis)被填充了静态资产,其中url作为哈希键.
遗憾的是,我无法关闭静态资产缓存控制标头,而不会影响Cloudflare和我的用户的浏览器如何缓存资产.我无法关闭控制器缓存或丢失页面/操作/片段缓存.如果删除Rack :: Cache中间件,结果相同.
有没有人有任何其他想法?
更新:我在这里打开了GitHub的门票.
caching ruby-on-rails ruby-on-rails-3.1 asset-pipeline cloudflare
我使用@import'部分表来组织我的css/sass:
/app
/assets
/stylesheets
_constants.sass
_layout.sass
...
app.css.sass
app.css.sass:
@import _constants.sass
// basic styles
@import _layout.sass
@import ...
Run Code Online (Sandbox Code Playgroud)
app.css.sass有一个@import规则_layout.sass,允许我在原始sass文件被压缩之前共享mixins和变量app.css
问题是Rails无法识别@import'd partials(_layout.sass)app.css的更改,并且在我对实际app.css.sass文件本身进行更改之前不会重新生成.这大大减慢了我的工作流程,意味着我必须添加/删除空行app.css.sass以查看更改.3.0中从未遇到过这个问题.
有没有办法迫使sass资产在开发中的每个服务器请求上重新生成?
在资产期间:预编译javascript被缩小,但是console.logs被保留.
有什么方法可以在代码推送到生产时删除预编译上的所有console.logs?
我正在尝试启动并运行新的生产服务器,它非常接近.当我执行
RAILS_ENV=production rake assets:precompile
Run Code Online (Sandbox Code Playgroud)
返回此错误
undefined method `[]' for nil:NilClass
Run Code Online (Sandbox Code Playgroud)
当我使用--trace运行它时,会重新调整
$RAILS_ENV=production rake assets:precompile --trace
** Invoke assets:precompile (first_time)
** Execute assets:precompile
rake aborted!
undefined method `[]' for nil:NilClass
(in /home/deploy/pm/app/assets/stylesheets/jquery-ui-1.8.16.custom.css.scss)
Tasks: TOP => assets:precompile
(See full trace by running task with --trace)
Run Code Online (Sandbox Code Playgroud)
我感谢任何人都可以提供任何帮助,想法等.
这是Gemfile和包列表
source 'http://rubygems.org'
gem 'cancan'
gem 'client_side_validations'
gem 'devise', '~> 1.5.3'
gem 'execjs'
gem 'haml'
gem 'httparty'
gem 'jquery-rails'
gem 'mysql2'
gem 'paperclip', "~> 2.4"
gem 'rails', '3.1.0'
gem 'rails3-jquery-autocomplete'
gem 'rake', '0.9.2'
gem 'remotipart', "~> …Run Code Online (Sandbox Code Playgroud) 有没有办法可以将目录中的所有文件包括在一个目录中,除了一个目录以外的所有目录?所以类似于:
require_tree . :except 'this_one'
Run Code Online (Sandbox Code Playgroud)
只是想知道并且无法弄清楚文档在清单文件中的"require_tree"方法的位置.
我想创建一个新文件夹app/assets,在这个文件夹中我有一些文件,每个文件都有css文件夹和javascript文件夹,如下面给出的地址:
app/assets/plugins/bootstrap/css/bootstrap.min.css
app/assets/plugins/bootstrap/js/bootstrap.min.js
我使用下面的代码来定义css文件,但不是true,rails无法找到并加载bootstrap.min.css:
<%= stylesheet_link_tag "bootstrap.min", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag "../plugins/bootstrap/css/bootstrap.min", media: "all", "data-turbolinks-track" => true %>
Run Code Online (Sandbox Code Playgroud)
我怎样才能申报css,并javascript从plugin文件夹?
注意:当我想css通过此地址在浏览器中查看文件时:
http://localhost:3000/assets/plugins/bootstrap/css/bootstrap.min.css
Run Code Online (Sandbox Code Playgroud)
我得到以下错误:
No route matches [GET] "/assets/plugins/bootstrap/css/bootstrap.min.css"
但是对于存在的css文件assets/stylesheets/我可以在浏览器中通过输入地址看顶部的css文件.为什么不同的beetwin stylesheets和plugins目录?
Grails 2.4现在使用Asset Pipeline来管理和处理Grails应用程序中的静态资产,而不是资源系统.这是相当新的,在互联网上没有太多关于它的文档.
我的问题是,如何正确处理第三方库?
例如,select2(http://ivaynberg.github.io/select2/)库在其单个平面文件夹中附带所有.css,.js,图像文件.
我应该在复制不同的文件类型及其相应的assets/javascripts/,assets/stylesheets/等子文件夹?如何处理那些没有像.json,text或doc文件这样明显位置的文件?
我应该创建一个vendors/select2/文件夹吗?在哪里,assets/在里面web-app/?然后,我应该如何从我的GSP加载所有必要的文件?
此lib也只在表单视图中需要,因此除非需要,否则不应加载.
我最近使用3.1 rc1分支了我的一个Rails 3.0项目来尝试新的资产管道.在进入3.1之前我一直在项目中使用Sass所以我在一个单独的配置文件中设置了一些变量和函数,让我所有的其他sass文件在第一行导入一个文件.
这样做非常好,不会在样式表中重复一些颜色代码和一般几何体.问题是现在新的Assets Pipeline是我所理解的,它将".css.sass"文件转换为原始css,然后将其附加到其余代码.
所以,如果我在"application.css"中指定:
/*
*= require ./configure
*= require ./what_ever_other_files_i_want_to_import
*/
Run Code Online (Sandbox Code Playgroud)
我得到的错误如下:
Sass::SyntaxError
Undefined variable: "$interactive".
Run Code Online (Sandbox Code Playgroud)
当我尝试从以下位置访问该文件时: http://localhost:3000/assets/application.css
有任何想法吗?
variables ruby-on-rails sass ruby-on-rails-3.1 asset-pipeline
在使用Rails 3.1 Asset Pipeline时,有没有办法强制每次请求重新生成资产?
当使用带有一系列partials和mixin文件的Less(less-rails)时,我在让系统获取文件更改时遇到问题.如果我可以强制系统在每个请求上生成,那么我的工作效率会更高.
在生产模式下,rails似乎无法从资产管道中找到任何预编译资产.
我在CentOS上使用RVM运行的rails 3.2.0和ruby 1.9.3.没有其他Web服务器与此应用程序一起运行.该应用程序最近才更新为使用资产管道,因为它最初是一个rails 3.0应用程序.
跑完之后
rake assets:clean
rake assets:precompile
Run Code Online (Sandbox Code Playgroud)
正如我所料,我看到公共/资产中的哈希内容.文件末尾的哈希值与我在页面源中看到的哈希值相匹配.
但是在运行时,这是我看到Rails尝试提供的每个资产的内容:
Started GET "/assets/application-892c6227e631daf9a8e041b1d4d002ec.css" for 75.149.58.169 at 2012-03-14 11:42:43 -0700
ActionController::RoutingError (No route matches [GET] "/assets/application-892c6227e631daf9a8e041b1d4d002ec.css"):
Run Code Online (Sandbox Code Playgroud)
我不是指每个资产所在的文件夹; 所有对资产的引用都是这样的:
//css:
.class {
background: url(asset.png) no-repeat;
}
//erb:
<%= image_tag "asset.png" %>
<%= link_to "page", :class => "class" %>
Run Code Online (Sandbox Code Playgroud)
production.rb中的资产管道相关设置:
config.serve_static_assets = false
config.assets.enabled = true
config.assets.compress = true
config.assets.debug = false
config.assets.compile = false
config.assets.digest = true
Run Code Online (Sandbox Code Playgroud)
最后,来自config/application.rb的资产设置:
config.assets.enabled = true
config.assets.version = '1.0'
Run Code Online (Sandbox Code Playgroud)
启动rails服务器进程的用户对公共/资产具有读,写和执行权限,因此我认为这不是权限问题.我错过了配置步骤吗?
编辑
我注意到没有错误声明资产没有预编译,因此我尝试通过在主机路径的末尾附加"/assets/application-892c6227e631daf9a8e041b1d4d002ec.css"来从网页访问样式表:
http://www.myapp.com"/assets/application-892c6227e631daf9a8e041b1d4d002ec.css"
Run Code Online (Sandbox Code Playgroud)
这工作,样式表打开.
asset-pipeline ×10
sass ×2
assets ×1
caching ×1
cloudflare ×1
grails ×1
import ×1
less ×1
rake ×1
variables ×1