36

我已经为 Heroku 部署了一个应用程序,但有一个我似乎无法弄清楚的问题。应用程序的 CSSBootstrap-sass未加载,因此我有一个未设置样式的应用程序。目前这只是静态页面的集合。

我已经按照自述文件中的所有步骤https://github.com/thomas-mcdonald/bootstrap-sass我无法弄清楚并且很可能是我的问题的步骤如下。由于 Rails 中的更改阻止了在 vendor 和 lib 中编译图像,因此您需要将以下行添加到 application.rb:

config.assets.precompile += %w(*.png *.jpg *.jpeg *.gif)

由于我对编程还是很陌生,第一个问题是我不知道在 application.rb 文件中的何处以及如何添加它。如果有人能帮助告诉我如何以及在何处正确添加上述代码行,我将不胜感激。

第二个问题可能与我正在使用的 gem 有关,但是当我创建应用程序时,sass-rails gem 是使用 ~> 4.0.0.beta1 安装的。根据自述文件,要使用的版本是 3.2。由于这也可能是一个问题,我已经包含了 gem 文件,以防有人确定这是我的问题的根本原因。

提前感谢您提供的任何帮助。

编辑:添加我在第一次尝试时采取的步骤,导致样式在我的本地主机上正常工作,但在代码部署到 heroku 后就不行了。

  1. 创建了一个新的 rails 4 应用程序(下面的 gem 文件)
  2. 添加了下面 gem 文件中列出的 bootstrap-sass gem
  3. 在生产组中将 PG gem 添加到我的 gem 文件中,并将 SQLite3 移至开发和测试(运行 bundle install --without production 按照步骤 2 和 3)
  4. 为静态主页创建了页面控制器
  5. 在主页上的 hero-unit 中添加了一个 h1 只是为了查看样式是否有效
  6. 添加了一个styles.css.scss 文件并包含@import 'bootstrap';到样式表
  7. 创建 git 存储库,运行我的初始提交并将代码推送到 git
  8. 创建heroku应用并将master推送到heroku

在第二次尝试中,我在主页上添加了一个导航栏(如果这对任何人都有影响的话)并再次执行第 7 步和第 8 步,但在执行这些步骤之前,我运行了以下代码行。

RAILS_ENV=production bundle exec rake assets:precompile

我最终还是得到了一个在我的本地主机上具有正确风格的网站,但在 Heroku 上没有任何风格。正如我在上面的原始帖子中所指出的,有一行代码需要添加到 application.rb 文件中,由于我不了解如何将这行代码正确地添加到文件中,我没有遵循。

宝石文件:

source 'https://rubygems.org'

ruby "2.0.0"

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.0.beta1'

group :production do
gem 'pg'
end

group :development, :test do
gem 'sqlite3'
end

# Gems used only for assets and not required
# in production environments by default.
group :assets do
gem 'sass-rails',   '~> 4.0.0.beta1'
gem 'coffee-rails', '~> 4.0.0.beta1'

gem 'bootstrap-sass', '~> 2.3.1.1'

# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'

# Turbolinks makes following links in your web application faster. Read more:  https://github.com/rails/turbolinks
gem 'turbolinks'

# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 1.0.1'

# To use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.0.0'

# Use unicorn as the app server
# gem 'unicorn'

# Deploy with Capistrano
# gem 'capistrano', group: :development

# To use debugger
# gem 'debugger'
4

8 回答 8

71

我刚刚(2013 年 6 月 13 日)从 Heroku 开发人员那里得到了这个答案,他们的支持引导我跨越了障碍。这就是我在 Heroku 应用程序中从 localhost 获取 css 显示的方式。

“您需要做的就是在生产中打开资产服务并将记录器设置为标准输出以使 Rails4 在 Heroku 上运行。我们目前正在努力简化 Rails 4 应用程序的部署过程,但与此同时,您可以更改你代码中的那些行,你就不需要那些宝石了。” (感谢 Bret 和 Neil 好消息)

在 /config/environments/production. 放:

config.cache_classes = true
config.serve_static_files = true
config.assets.compile = true
config.assets.digest = true

我不知道记录器中的标准输出,所以无法检查。

做一个 git add 。和 git 提交。

确保 /config/database.yml 具有:

production:
  adapter: postgresql
  encoding: unicode
  database: Your_appname_production

您将需要此信息用于下面的 env 命令。

确保您的 Gemfile 中有 gem 'pg' 在生产环境中进行另一个 git 提交。

在应用程序的终端中以一行方式运行此命令:

env RAILS_ENV=production DATABASE_URL=postgresql://user:pass@127.0.0.1/Your_app_name_production bundle exec rake assets:precompile 2>&1

其中 DATABASE_URL=postgresql 与 yml 文件中的生产适配器相同,并且指定了 Your_app_name_production,因为 Heroku 似乎只运行生产。

我被建议反对并且不需要:

group :production do
  gem 'rails_log_stdout',           github: 'heroku/rails_log_stdout'
  gem 'rails3_serve_static_assets', github: 'heroku/rails3_serve_static_assets'
end

它在捆绑安装和 Heroku 中出错。

不知道这是否有帮助,但我还添加了生产

Bundler.require(*Rails.groups(assets: %w(development test production)))

不记得我在哪里看到的建议。

HTH阿雷尔

于 2013-06-13T08:38:35.677 回答
18

bundle exec rake assets:precompile在推送到heroku之前运行

于 2013-11-14T09:35:23.523 回答
8

我可以通过将这两个 gem 添加到我的应用程序来解决这个问题

group :production do
  gem 'rails_log_stdout',           github: 'heroku/rails_log_stdout'
  gem 'rails3_serve_static_assets', github: 'heroku/rails3_serve_static_assets'
end

添加它,运行bundle install然后推送到heroku。

您的样式应该开始加载。

于 2013-05-12T09:05:14.837 回答
4

首先从 Rails beta 升级到最新版本

检查您可能设置的位置config.assets.initialize_on_precompile = false,因为这可能会使其回退到非链轮资产解析(我猜您在阅读 heroku 文档上的 Rails 3.x 时可能已将其设置为 false)。

将其设置回默认值true

ruby config.assets.initialize_on_precompile = true

然后user-env-compile在heroku上启用应用程序:

# Enable precompile support for the app
heroku labs:enable user-env-compile
# Remove precompiled assets
rm -rf public/assets/
git add -u 
git commit -m 'Remove precompiled assets'
# Now push and everything should just work from now on
git push heroku master

改编自这个 bootstrap-sass 问题评论

于 2014-02-03T23:44:33.253 回答
4

config.assets.compile=true在文件中设置/config/environments/production.rb

config.assets.compile=true

单击此处了解有关资产管道的更多信息。

于 2014-02-08T23:13:43.433 回答
3

这个英雄问题的一个简单原因可能是混合 css 文件类型。根据我自己的经验,如果您推出包含 .css 和 .scss 文件类型的资产文件夹,就会发生这种情况。也许其他人可以解释为什么会发生这种情况......但是,我所要做的就是将 .css 文件重命名为 .scss。然后,一切编译正确,世界上一切正常。

于 2014-11-22T20:46:34.713 回答
2
config.cache_classes = true
config.serve_static_assets = true
config.assets.compile = true
config.assets.digest = true

在 config/envirnoments/production.rb 中设置这些为我解决了与 apache 服务器类似的问题

于 2013-08-21T09:30:03.973 回答
2

我不会设置config.assets.compile = true这对性能有影响(但它确实有效)。

如此处所述: https ://stackoverflow.com/a/16882028/647427

When using the asset pipeline, paths to assets must be re-written and sass-rails provides -url and -path helpers (hyphenated in Sass, underscored in Ruby) for the following asset classes: image, font, video, audio, JavaScript and stylesheet.

image-url("rails.png") becomes url(/assets/rails.png)
image-path("rails.png") becomes "/assets/rails.png"
The more generic form can also be used but the asset path and class must both be specified:

asset-url("rails.png", image) becomes url(/assets/rails.png)
asset-path("rails.png", image) becomes "/assets/rails.png"
于 2014-01-14T21:41:08.173 回答