我有一个模型,其中有一个方法可以将url返回给人的头像,如下所示:
def avatar_url
if self.avatar?
self.avatar.url # This uses paperclip
else
"/images/avatars/none.png"
end
end
Run Code Online (Sandbox Code Playgroud)
我正在升级到3.1,所以现在需要通过资产管道引用硬编码的无图像.在控制器或视图中,我只是将其包装image_path(),但我在模型中没有该选项.如何为图像生成正确的URL?
ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 asset-pipeline
我有一个iframe,它呈现部分并且不是主应用程序布局或资产管道的一部分.
我想要包含一些样式表,但是我收到此错误:
ActionView::Template::Error (960sm.css isn't precompiled):
Run Code Online (Sandbox Code Playgroud)
Rails 3.1 Heroku
在我的application.js文件中,我有:
//= require jquery
//= require jquery_ujs
//= require underscore
//= require backbone
//= require_tree .
//
//= require .//community_app
//
//= require_tree ../templates/
//= require_tree .//models
//= require_tree .//collections
//= require_tree .//views
//= require_tree .//routers
Run Code Online (Sandbox Code Playgroud)
但生成的html不遵守此顺序:
<head>
<title>CommunityApp</title>
<link href="/assets/application.css?body=1" media="all" rel="stylesheet" type="text/css" />
<link href="/assets/communities.css?body=1" media="all" rel="stylesheet" type="text/css" />
<link href="/assets/home.css?body=1" media="all" rel="stylesheet" type="text/css" />
<script src="/assets/jquery.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_ujs.js?body=1" type="text/javascript"></script>
<script src="/assets/underscore.js?body=1" type="text/javascript"></script>
<script src="/assets/backbone.js?body=1" type="text/javascript"></script>
<script src="/assets/collections/communities.js?body=1" type="text/javascript"></script>
<script src="/assets/community_app.js?body=1" type="text/javascript"></script>
<script src="/assets/home.js?body=1" type="text/javascript"></script>
<script src="/assets/models/community.js?body=1" …Run Code Online (Sandbox Code Playgroud) 我想知道是否有任何方法可以让Rails网络服务器(瘦)服务于资产管道创建的*.gz文件.据我所知,那些压缩级别比压缩级别更高Rack::Deflater,只能serve_static_assets在rackup文件中使用,而不能在config.middleware.
一个不太理想的解决方案可能是更改默认压缩级别,Zlib即哪些Rack::Deflater引用.它应该只需要gzip一次,然后它去Rack::Cache,然后希望是CDN.
第二个不太理想的解决方案可能是a Rack::Rewrite.
在升级到ruby 1.9.3之后,我的一个应用程序工作正常,但是当我尝试使用capistrano进行部署时,我尝试转换的第二个应用程序在"assets:precompile"阶段失败.这是堆栈跟踪:
rake aborted!
rake aborted!
invalid byte sequence in US-ASCII
/Users/george/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/trace_output.rb:16:in `block in trace_on'
/Users/george/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/trace_output.rb:14:in `map'
/Users/george/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/trace_output.rb:14:in `trace_on'
/Users/george/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:328:in `trace'
/Users/george/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:183:in `display_error_message'
/Users/george/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:169:in `rescue in standard_exception_handling'
/Users/george/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:159:in `standard_exception_handling'
/Users/george/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:88:in `load_rakefile'
/Users/george/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:72:in `block in run'
/Users/george/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:160:in `standard_exception_handling'
/Users/george/.rvm/gems/ruby-1.9.3-p392@global/gems/rake-10.0.4/lib/rake/application.rb:70:in `run'
/Users/george/.rvm/gems/ruby-1.9.3-p392@rails3211/bin/ruby_noexec_wrapper:14:in `eval'
/Users/george/.rvm/gems/ruby-1.9.3-p392@rails3211/bin/ruby_noexec_wrapper:14:in `<main>'
Run Code Online (Sandbox Code Playgroud)
我已经阅读了很多帖子并尝试了几个建议,但无济于事.我尝试将以下内容添加到我的gemfile顶部:
if RUBY_VERSION =~ /1.9/
Encoding.default_external = Encoding::UTF_8
Encoding.default_internal = Encoding::UTF_8
end
Run Code Online (Sandbox Code Playgroud)
但它没有任何区别.
我检查了LANG和LC_ALL环境变量,如下所示
$ echo $LC_ALL
en_NZ.UTF-8
$ echo $LANG
en_NZ.UTF-8
Run Code Online (Sandbox Code Playgroud)
我恐怕我根本不理解这个消息,我不知道如何识别有问题的文件.
我不能运行任何rake任务 - 它给出了同样的错误.
请注意,我可以在开发模式下完美地运行应用程序.
我似乎无法找到一种方法来禁用Rails 4.1中的资产管道.我看到Rails 3.2的很多信息.
我想使用Grunt/GulpJs和bower来处理我的所有资产,我似乎无法找到适合自己的东西.相反,我找到了一个不错的数量,但大多数不适用于我或被打破.
有half-pipe宝石.但是,半管道依赖于Rails 4.0而且我在Rails 4.1上,我无法找到在不同版本的Rails中强制安装Gem的地方,如果可能的话.
这个问题扩展到了比我预想的更多问题.基本上我只需要知道如何禁用资产管道,除非如何集成GruntJS.
我在我的控制器中使用PDFkit来构建一系列PDF,将它们压缩,然后将它们发送给用户.
为了控制输出样式,我告诉PDFKit在内容生成期间使用哪些样式表.我需要传递CSS文件的文件引用.由于Rails现在正在编译和重命名我的样式表,我不确定如何在我的控制器中引用已编译的CSS资产.
这是我以前做的事情:
InvoicesController < ApplicationController
def download
kit = PDFKit.new(render_to_string(:show, :layout => false))
kit.stylesheets << "#{Sass::Plugin.options[:css_location]}/application.css"
kit.to_file("#{file_date_string}.pdf")
# snip
end
end
Run Code Online (Sandbox Code Playgroud)
Sass :: Plugin.options [:css_location]现在返回错误的位置,更不用说application.css不再是文件的有效名称.我要指出,我有作为一个清单给我SCSS文件的应用程序/资产/ application.css文件,它是在我的意见通过stylesheet_link_tag()方法工作正常.
基本上我正在寻找的是一个控制器,相当于asset_path(),以便做这样的事情:
kit = PDFKit.new(render_to_string(:show, :layout => false))
kit.stylesheets << asset_path('application.css')
kit.to_file("#{file_date_string}.pdf")
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
为了使控制器特定的JavaScript逻辑不在标准范围内,application.js并且只有相关控制器包含它,我将它放在自己的.js文件中,并根据布局中的控制器名称包含它,如下所示:
<%= javascript_include_tag "application", params[:controller] %>
Run Code Online (Sandbox Code Playgroud)
这很好,但是当我将应用程序部署到生产环境时(我正在使用Capistrano并设置了预编译任务),资产管道不会预编译任何特定于控制器的JS文件.我认为这是因为我的实际JavaScript文件没有被application.js中的require指令引用.
如何在不将我的控制器特定JS移回application.js或从application.js显式引用它的情况下处理这个问题?
有没有办法告诉资产管道预编译其他列表文件?如何在生产中手动预编译特定文件?
更新
因为它证明,您可以在这里指定单个文件config/environments/production.rb:
config.assets.precompile += %w( achievements.js )
Run Code Online (Sandbox Code Playgroud)
...或者我只是继续前进,并为每个JavaScript文件任意添加它:
config.assets.precompile += %w( *.js )
Run Code Online (Sandbox Code Playgroud) 大更新:
当我终于找到真正的解决方案时,我也发现了真正的问题.正如我在这里写下了许多无用的信息,考虑到真正的问题,我正在对问题进行大量更新,以便其他人可以轻松找到正在发生的事情,并且可以看到解决方案.
问题:这是因为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
Run Code Online (Sandbox Code Playgroud)
然后,为了防止rails将其他资源渲染两次(预编译的资源),只需执行以下命令:
rake assets:clean
Run Code Online (Sandbox Code Playgroud)
它与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.
javascript ruby development-environment ruby-on-rails asset-pipeline
我遇到了类似于这个问题的问题: Rails资产管道不包括application.js中的必需文件然而,这个问题已经关闭,所以我重新询问它,但是我的具体情况.)
Ruby 2.0.0,Rails 3.2.8,OSX 10.7.5,Chrome 28.0.1500.95
置于"/ app/assets/javascripts"中的文件似乎没有编译或出现在"/ public/assets"中
如果我在app/assets/javascripts中放置一个这样的test.js文件:
alert("Hello!");
Run Code Online (Sandbox Code Playgroud)
然后在我的应用程序中重新加载页面,此警报应该出现.(我正在复制Ryan Bates在资产管道上的Railscast中在~6:30进行视频时所做的事情)但是,没有出现警报.
我做了一些测试来尝试调试这个.
// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
//
// …Run Code Online (Sandbox Code Playgroud) asset-pipeline ×10
ruby-on-rails ×10
javascript ×3
ruby ×3
heroku ×2
actionview ×1
bundler ×1
gruntjs ×1
gzip ×1
rack ×1
rake ×1
sprockets ×1