标签: asset-pipeline

如何从模型中引用资产管道中的图像?

我有一个模型,其中有一个方法可以将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

22
推荐指数
3
解决办法
2万
查看次数

ActionView :: Template :: Error(960.css未预编译)

我有一个iframe,它呈现部分并且不是主应用程序布局或资产管道的一部分.

我想要包含一些样式表,但是我收到此错误:

 ActionView::Template::Error (960sm.css isn't precompiled):
Run Code Online (Sandbox Code Playgroud)

Rails 3.1 Heroku

ruby-on-rails heroku actionview asset-pipeline

22
推荐指数
1
解决办法
9022
查看次数

Rails指定javascript文件的加载顺序?

在我的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)

javascript ruby ruby-on-rails asset-pipeline

22
推荐指数
1
解决办法
2万
查看次数

有没有办法从heroku提供gzip资产?

我想知道是否有任何方法可以让Rails网络服务器(瘦)服务于资产管道创建的*.gz文件.据我所知,那些压缩级别比压缩级别更高Rack::Deflater,只能serve_static_assets在rackup文件中使用,而不能在config.middleware.

一个不太理想的解决方案可能是更改默认压缩级别,Zlib即哪些Rack::Deflater引用.它应该只需要gzip一次,然后它去Rack::Cache,然后希望是CDN.

第二个不太理想的解决方案可能是a Rack::Rewrite.

gzip rack ruby-on-rails heroku asset-pipeline

22
推荐指数
2
解决办法
1万
查看次数

rake任务因US-ASCII中的无效字节序列而失败

在升级到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任务 - 它给出了同样的错误.

请注意,我可以在开发模式下完美地运行应用程序.

ruby rake ruby-on-rails bundler asset-pipeline

22
推荐指数
2
解决办法
1万
查看次数

禁用Asset Pipeline/Sprockets Rails 4.1

我似乎无法找到一种方法来禁用Rails 4.1中的资产管道.我看到Rails 3.2的很多信息.

我想使用Grunt/GulpJs和bower来处理我的所有资产,我似乎无法找到适合自己的东西.相反,我找到了一个不错的数量,但大多数不适用于我或被打破.

half-pipe宝石.但是,半管道依赖于Rails 4.0而且我在Rails 4.1上,我无法找到在不同版本的Rails中强制安装Gem的地方,如果可能的话.

这个问题扩展到了比我预想的更多问题.基本上我只需要知道如何禁用资产管道,除非如何集成GruntJS.

ruby-on-rails sprockets asset-pipeline gruntjs

22
推荐指数
2
解决办法
1万
查看次数

如何从Rails 3.1中的控制器引用编译资产?

我在我的控制器中使用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)

有人可以帮忙吗?

ruby-on-rails ruby-on-rails-3.1 asset-pipeline

21
推荐指数
4
解决办法
7966
查看次数

Rails 3.1用于预编译控制器特定JS资产的策略

为了使控制器特定的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)

ruby-on-rails ruby-on-rails-3 asset-pipeline

21
推荐指数
3
解决办法
5936
查看次数

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
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

21
推荐指数
1
解决办法
6603
查看次数

为什么我的rails资产管道中的js文件没有被编译?

我遇到了类似于这个问题的问题: 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进行视频时所做的事情)但是,没有出现警报.

调试尝试

我做了一些测试来尝试调试这个.

  • (所建议的下面@Aidan)如果我"室射频公共/资产",然后添加"javascript_include_tag'测试’"我的布局,警报不会 出现.但是,也许是因为我是n00b,我不知道这有助于我调试问题.
  • 如果我添加// = require_test到应用程序/ JavaScript的/ application.js中我的清单文件,这并不会导致警报出现.

我的清单文件(app/javascripts/application.js)

// 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)

javascript ruby-on-rails asset-pipeline

21
推荐指数
1
解决办法
2万
查看次数