2014-02-23 50 views
12

我在升级应用程序以使用资产管道。rails - 在生产模式下找不到application.css资产

我已经得到了CSS资产编译成一个应用程序的CSS文件,但是当我运行在生产模式与

RAILS_ENV=production bundle exec rails s 

的应用程序,他们没有发现我访问任何网页我从正确的输出数据库但没有造型和日志显示:

ActionController::RoutingError (No route matches [GET] 
"/assets/default.scss-1a27c...f07c.css"): 

即使该文件中存在的公共/资产

$ ls public/assets/def* 
public/assets/default.scss-1a27c...f07c.css  public/assets/default.scss.css 
public/assets/default.scss-1a27c...f07c.css.gz public/assets/default.scss.css.gz 

我需要更改哪些内容才能让服务器找到资产文件?

我的其他.css文件也一样。他们被编入公共/资产与指纹,但没有找到。

页源被示出:

<link href="/assets/default.scss-1a27c...f07c.css" 
media="screen" rel="stylesheet" type="text/css" /> 

导轨(HAML)源是= stylesheet_link_tag 'default.scss.css'

public.assets curently包括具有以下文件。

$ ls public/assets/def* 
public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css 
public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css.gz 
public/assets/default.scss.css 
public/assets/default.scss.css.gz 

application.rb中有

$ cat config/application.rb 
require File.expand_path('../boot', __FILE__) 

# Pick the frameworks you want: 
require "active_record/railtie" 
require "action_controller/railtie" 
require "action_mailer/railtie" 
require "active_resource/railtie" 
require "sprockets/railtie" 
# require "rails/test_unit/railtie" 

if defined?(Bundler) 
    # If you precompile assets before deploying to production, use this line 
    Bundler.require(*Rails.groups(:assets => %w(development test))) 
    # If you want your assets lazily compiled in production, use this line 
    # Bundler.require(:default, :assets, Rails.env) 
end 

module Linker 
    class Application < Rails::Application 
    config.encoding = "utf-8" 
    config.filter_parameters += [:password] 
    config.assets.enabled = true 
    config.assets.initialize_on_precompile = false # For Heroku 
    config.assets.version = '1.0' 
    end 
end 

config/environments/production有:

$ cat config/environments/production.rb 
Linker::Application.configure do 
    config.consider_all_requests_local  = false 
    config.action_controller.perform_caching = true 
    config.assets.precompile += ['default.scss.css','main.css', 'jquery-ui-1.8.22.custom.css'] 
    config.serve_static_assets = false 
    config.assets.compress = true 
    config.assets.compile = false 
    config.assets.digest = true 
    config.log_level = :debug 
    config.i18n.fallbacks = true 
    config.active_support.deprecation = :notify 
end 

这似乎是对发生的所有资产,例如

Started GET "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 
ActionController::RoutingError (No route matches [GET] "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css"): 
Started GET "/assets/main-6864687b4114a1c316e444bd90f233ff.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 
ActionController::RoutingError (No route matches [GET] "/assets/main-6864687b4114a1c316e444bd90f233ff.css"): 
Started GET "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 
ActionController::RoutingError (No route matches [GET] "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css"): 
Started GET "/assets/application-fc1d492d730f2a45581a40eac4607db8.js" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 
ActionController::RoutingError (No route matches [GET] "/assets/application-fc1d492d730f2a45581a40eac4607db8.js"): 
Started GET "/images/link.ico" for 127.0.0.1 at 2014-02-23 10:24:48 -0500 
ActionController::RoutingError (No route matches [GET] "/images/link.ico"): 
+1

您是否做'rake assets:precompile' – emaillenin

+0

是的,我做了'$ RAILS_ENV =生产包exec rake assets:precompile'并重新启动了我的服务器 –

+1

你能复制你的application.rb和production.rb文件吗? – arieljuod

回答

22

Rails的默认情况下不提供public下的资产。查看你的production.rb

config.serve_static_assets = false 

把它变成真,你就可以走了。 (注意:您不希望在生产中成为true,请记住在部署之前将其更改回去)

有关详细信息,请参见Configuring Rails Applications

+0

为什么它在生产中是错误的?我正在使用rails_12factor和heroku。感谢您的进一步解释! –

+1

@LeoBrown Rails假定在生产中,您有一个在Rails之前运行的Web服务器(Apache,nginx),或者甚至是专门用于静态资产的CDN。其中任何一种都可以比Rails更快地提供静态资产。 – awendt

+3

对于Rails 5:在config/environments/production.rb中将'config.public_file_server.enabled'设置为'true'。 – vmarquet

3

当你做rake assets:precompile,你的资产进入公共目录。看看你是否能在public/assets/

找到这些文件,你应该看到这样的事情:

I, [2014-02-23T20:06:21.853314 #26915] INFO -- : Writing app_root/public/assets/application-ecd8636fc80ea2b712039c4abc365da9.css 
+1

当你预编译,它写入哪个目录? – emaillenin

+0

+1谢谢,它似乎是写给公众/资产,至少这是指纹文件的位置。 –

+1

新写入的文件名和被请求的文件名是否匹配? – emaillenin

9

在Rails 4,你可以让他们在生产中表现出通过将环境变量(本地运行):

RAILS_SERVE_STATIC_FILES=true rails server -e production

这应该只要你有这条线工作,/config/environments/production.rb

config.serve_static_files = ENV ['RAILS_SERVE_STATIC_FILES']。present?

5

Rails 5解决方案类似于上面的Jules Copeland给出的Rails 4 solution

在您的预生成config/environments/production.rb文件,应该是看起来像这样的条目:

# Disable serving static files from the `/public` folder by default since 
# Apache or NGINX already handles this. 
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? 

我发现这个设置一个体面的解释在Configuring Rails Applications guidehttp://guides.rubyonrails.org

config.public_file_server.enabled将Rails配置为从公共目录提供静态 文件。此选项默认为true,但在 生产环境中,它被设置为false,因为用于运行应用程序的服务器 软件(例如NGINX或Apache)应该替代地为 服务静态文件。如果您使用WEBrick在 生产模式下运行或测试您的应用(不建议使用 生产中的WEBrick),请将该选项设置为true。否则,您将无法使用 页面缓存和请求存在于公共 目录下的文件。

结论:在生产中,开始你的钢轨服务器将使Rails的服务于大众/资产目录中的任何文件,就如同将一个Web服务器。请记住,Rails是一款应用服务器,不会像Web服务器那样高效(例如NGINX,Apache等)。对于真实世界的应用程序,您应该有一个专门的Web服务器,它位于Rails前面,它将自己提供静态资源,并只根据需要为动态内容打扰Rails。有关更多详细信息,请参阅Justin Weiss的this article关于Web服务器和应用程序服务器之间的差异。