我在 Rails 3.2rc1 应用程序中拥有一些资源,以下是其中的一些:
app/
assets/
stylesheets/
application.css.scss
users.css.scss
projects.css.scss
(...)
parts/
fonts.scss
(...)
Run Code Online (Sandbox Code Playgroud)
这application.css.scss只是一个清单,其中包含以下行:
@import 'parts/fonts';
Run Code Online (Sandbox Code Playgroud)
并views/layouts/application.html.slim加载预编译的样式表:
= stylesheet_link_tag "application", media: "all"
= stylesheet_link_tag params[:controller], media: "all"
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好,对于开发来说效果很好。在生产部署期间,rake assets:precompile被调用并且它对于应用程序样式表运行良好。但是每个控制器的样式表被跳过,因此应用程序崩溃了。
为了解决这个问题,我将其添加到config/environments/production.yml:
config.assets.precompile += %w(*.css *.js)
Run Code Online (Sandbox Code Playgroud)
现在已经编译了每个控制器的样式表,但该应用程序仍然会出现以下问题:
ActionView::Template::Error (application.css isn't precompiled):
5: = stylesheet_link_tag "application", media: "all"
app/views/layouts/application.html.slim:5:in `_app_views_layouts_application_html_slim__4032169744877009540_23192340'
Run Code Online (Sandbox Code Playgroud)
但是当我查看时public/assets/,预编译的application-3218a93530ecb65582d5b345133dab49.css和压缩的双胞胎就在那里。
如果我将通配符替换为config/environments/production.yml所有每个控制器样式表的列表(换句话说:除了 之外的所有样式表application.css),一切都会像魅力一样工作:
config.assets.precompile += %w(users.css projects.css)
Run Code Online (Sandbox Code Playgroud)
应用程序样式表是否被处理了两次,从而导致预编译无法像宣传的那样工作?
为什么 Rails 不预编译.js.erb资产?
我的config/application.rb:
require File.expand_path('../boot', __FILE__)
require 'rails/all'
Bundler.require(:default, Rails.env)
module Sflitmap
class Application < Rails::Application
# these precompile OK
config.assets.precompile += ['edge/edge.1.5.0.min.js', 'edge/ink-falling_edgeActions.js', 'edge/inkAnimationTrigger.js']
# this will not precompile
config.assets.precompile += ['edge/ink-falling_edge.js.erb']
end
end
Run Code Online (Sandbox Code Playgroud)
我的config/environments/production.rb:
Sflitmap::Application.configure do
# Settings specified here will take precedence over those in config/application.rb.
# Code is not reloaded between requests.
config.cache_classes = true
# Eager load code on boot. This eager loads most of Rails and
# …Run Code Online (Sandbox Code Playgroud) 我希望使用基于 Heroku 实验室设置的任何可能值的缓存键将文件加载到我的 Rails 缓存中:Dyno 元数据插件 ( https://devcenter.heroku.com/articles/dyno-metadata )。
在那篇文章中,我正在寻找一个在 slug 构建过程早期可用的唯一标识符。
HEROKU_RELEASE_CREATED_AT: 2015-04-02T18:00:42Z
HEROKU_RELEASE_VERSION: v42
HEROKU_SLUG_COMMIT: 2c3a0b24069af49b3de35b8e8c26765c1dba9ff0
这是我感兴趣的三个(上面的示例数据)。在我的资产预编译步骤中,我依赖于一个唯一值,我决定使用上述 3 个中的任何一个。此步骤是在我的 Rails 应用程序运行之前完成的。
最初我尝试过,HEROKU_RELEASE_VERSION但我注意到它直到 slug 构建过程完成才设置,这意味着在我的资产预编译步骤中,它是nil.
然后我试图HEROKU_SLUG_COMMIT看看在资产预编译之前是否知道这一点。它是否正确?从一些初始测试来看,它似乎工作正常(至少在资产预编译之前已知),但是我想知道这些设置的正确顺序。
如果这不是 中可用的早期值ENV[],那么更好的建议是什么?
====== 更新:
我一直在尝试使用以下值的配置:
HEROKU_RELEASE_CREATED_AT: 2015-04-02T18:00:42Z
HEROKU_RELEASE_VERSION: v42
HEROKU_SLUG_COMMIT: 2c3a0b24069af49b3de35b8e8c26765c1dba9ff0
我注意到,在构建资产之前,上述值不会在构建前发生变化,而是在构建后发生变化。下面,我得到了下面的结果输出。正如您所看到的,当前的部署只是2583508在构建过程中ENV['HEROKU_SLUG_COMMIT']返回8318914,直到应用程序完成,然后ENV['HEROKU_SLUG_COMMIT']更新为2583508.
=== sample-app Releases - Current: v356
v356 Deploy 2583508 email@gmail.com 2017/04/26 20:05:51 -0400 (~ 40s ago)
v355 Deploy 8318914 email@gmail.com 2017/04/26 19:51:33 -0400 …Run Code Online (Sandbox Code Playgroud) 我发现了几个关于在vendor/assets目录中包含资产的不同线程,但没有找到任何对我有用的东西。以前,我将所有供应商资产都放在app/目录中,但将 JavaScript 移到了vendor/assets/javascripts/目录中,将 CSS 移到了vendor/assets/stylesheets/目录中。
我现在正在尝试在开发和生产中加载我的供应商资产,但它们根本没有加载。这是我的assets.rb文件:
# Be sure to restart your server when you modify this file.
# Version of your assets, change this if you want to expire all your assets.
Rails.application.config.assets.version = '1.0'
# Add additional assets to the asset load path
# Rails.application.config.assets.paths << Emoji.images_path
# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
Rails.application.config.assets.precompile += [
Rails.root.join('vendor/assets/javascripts/*').to_s,
Rails.root.join('vendor/assets/stylesheets/*').to_s …Run Code Online (Sandbox Code Playgroud) 我正在升级到rails 3.1,我需要让/ images目录成为/ assets的别名.这可能吗?原因是我不想要我发送给客户的电子邮件,这些电子邮件直接链接到/ images中的文件.
这可能在Web服务器级别吗?我在nginx上.
我在dir中找到了class AvatarUploader < Carrierwave::Uploader::Base哪些商店User头像public/uploads:
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
version :main do
process :resize_to_limit => [128, 128]
end
Run Code Online (Sandbox Code Playgroud)
我想在production启用资源预编译的模式下启动应用程序.除了头像之外的一切都很好.当我访问任何User个人资料时,我得到:
Started GET "/users/1" for 127.0.0.1 at 2012-05-03 17:45:24 +0300
Processing by Users::UsersController#show as HTML
Parameters: {"id"=>"1"}
Rendered users/users/show.html.erb within layouts/application (2.5ms)
Completed 500 Internal Server Error in 16ms
ActionView::Template::Error ( isn't precompiled):
87: <%= image_tag @user.avatar_url(:main).to_s %>
app/views/users/users/show.html.erb:87:in `_app_views_users_users_show_html_erb___538221278131396366_28399560'
Run Code Online (Sandbox Code Playgroud)
也许有一种方法可以关闭头像的预编译(因为它们可以在应用程序在生产中运行时重新上传).请提供有关如何解决此问题的任何建议.谢谢.
ruby-on-rails pre-compilation ruby-on-rails-3 carrierwave asset-pipeline
我正在尝试在Amazon的EC2服务器上部署Web应用程序,并且我在服务器上有代码.一切看起来都在工作,但是当我转到主页时,我收到500错误消息,该production.log文件给出了以下错误:
ActionView::Template::Error (image.png isn't precompiled)
Run Code Online (Sandbox Code Playgroud)
我试过跑rake assets:precompile,
我已经改变了行config/environments/production.rb到config.assets.compile = true
image.png内容public/assets/manifest.yml但我仍然得到同样的错误.
我正在运行Rails 3.2.6和Ruby 1.8.7.
谢谢你的帮助!
我已经在ubuntu 12.04服务器上安装了nodejs,我想知道为什么我在编译资产时遇到问题,当我去控制台时rails c运行这个
ExecJS::Runtimes.best_available=> #<ExecJS::ExternalRuntime:0x0000000118cc88
@binary="nodejs",
@command=["nodejs", "node"],
@deprecated=false,
@encoding="UTF-8",
@name="Node.js (V8)",
@runner_path= "/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/execjs-1.4.0/lib/execjs/support/node_runner.js",
Run Code Online (Sandbox Code Playgroud)
@ test_args = nil,@ test_match = nil>
当然我可以运行node或nodejs命令,可能出错,这是尝试编译资产后的错误
/home/bonsai/.rvm/rubies/ruby-1.9.3-p392/bin/ruby /home/bonsai/.rvm/gems/ruby-1.9.3-p392@global/bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets
rake aborted!
Killed
(in /home/bonsai/bonsaierp/app/assets/javascripts/application.js.coffee)
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/execjs-1.4.0/lib/execjs/external_runtime.rb:142:in `exec_runtime'
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/execjs-1.4.0/lib/execjs/external_runtime.rb:28:in `block in exec'
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/execjs-1.4.0/lib/execjs/external_runtime.rb:41:in `compile_to_tempfile'
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/execjs-1.4.0/lib/execjs/external_runtime.rb:27:in `exec'
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/uglifier-1.3.0/lib/uglifier.rb:100:in `compile'
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/actionpack-3.2.13/lib/sprockets/compressors.rb:74:in `compress'
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/sprockets-2.2.2/lib/sprockets/processing.rb:265:in `block in js_compressor='
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/sprockets-2.2.2/lib/sprockets/processor.rb:29:in `call'
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/sprockets-2.2.2/lib/sprockets/processor.rb:29:in `evaluate'
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/tilt-1.3.6/lib/tilt/template.rb:77:in `render'
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/sprockets-2.2.2/lib/sprockets/context.rb:193:in `block in evaluate'
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/sprockets-2.2.2/lib/sprockets/context.rb:190:in `each'
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/sprockets-2.2.2/lib/sprockets/context.rb:190:in `evaluate'
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/sprockets-2.2.2/lib/sprockets/bundled_asset.rb:26:in `initialize'
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/sprockets-2.2.2/lib/sprockets/base.rb:252:in `new'
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/sprockets-2.2.2/lib/sprockets/base.rb:252:in `build_asset'
/home/bonsai/.rvm/gems/ruby-1.9.3-p392@rails3.2/gems/sprockets-2.2.2/lib/sprockets/index.rb:93:in `block in build_asset' …Run Code Online (Sandbox Code Playgroud) 这对我来说已经有一段时间了,但是我仍然无法弄清楚资产管道在Rails 4中是如何工作的.我终于学会了如何预编译资产,但是在部署之后,我的CSS样式表再次没有了.得到更新.
我通过访问开发人员工具并查看源来确认了这一点.它看起来与我的CSS文件不同.我的猜测是问题在于我的production.rb文件.
Production.rb
Games::Application.configure do
config.cache_classes = true
config.eager_load = true
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
config.serve_static_assets = true
config.assets.js_compressor = :uglifier
config.assets.compile = true
config.assets.digest = true
config.assets.version = '1.0'
config.log_level = :info
config.i18n.fallbacks = true
config.active_support.deprecation = :notify
config.log_formatter = ::Logger::Formatter.new
end
Run Code Online (Sandbox Code Playgroud)
application.rb中
require File.expand_path('../boot', __FILE__)
require 'rails/all'
Bundler.require(*Rails.groups)
module Games
class Application < Rails::Application
config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif)
config.exceptions_app = self.routes
end
end
Run Code Online (Sandbox Code Playgroud)
这是带有帮助程序的Application.html.erb文件.
<!DOCTYPE html>
<html>
<head>
<title><%= @title %></title>
<%= stylesheet_link_tag …Run Code Online (Sandbox Code Playgroud) 我的文件结构是这样的
app
assets
bookshelf
assets
my_image.jpg
images
standard_image.png
Run Code Online (Sandbox Code Playgroud)
在我的css.scss文件中,这两个都在开发中,但它们在生产中不起作用.
#some_div {
background: url("standard_image.png")
}
#some_div {
background: url("assets/my_image.jpg")
}
Run Code Online (Sandbox Code Playgroud)
我已经做了RAILS_ENV=production rake assets:clean assets:precompile.我删除了我的tmp/cache.
我觉得这可能是配置问题.我错过了什么?
我知道图像在服务器上.我得到了消化的文件名,并将其放入带有生产根地址的URL中.
当我尝试使用时
background: asset-url("assets/my_image.jpg", image)
Run Code Online (Sandbox Code Playgroud)
我明白了
Sprockets :: Rails :: Helper :: AssetFilteredError at books
资产过滤掉,将不送达:添加
Rails.application.config.assets.precompile += %w( assets/bookshelf_skin02_top_bg.jpg )到config/initializers/assets.rb并重新启动服务器
显然,我不想在配置中添加每个资产文件.
asset-pipeline ×10
heroku ×3
css ×2
ruby ×2
carrierwave ×1
erb ×1
image ×1
javascript ×1
nginx ×1
node.js ×1
precompiled ×1
sass ×1
sprockets ×1
vendor ×1