生产环境下禁用 serve_static_assets 时,Rails 无法启动。

6
在我的production.rb文件中添加config.serve_static_assets = false后,网站就无法正常工作了。我看到的只有这个:
demosite.com(master)$ RAILS_ENV=production rails s
WARNING: Use strings for Figaro configuration. false was converted to "false".
=> Booting Puma
=> Rails 4.1.4 application starting in production on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
Exiting
/Users/user1/.rvm/gems/ruby-2.2.1/gems/actionpack-4.1.4/lib/action_dispatch/middleware/stack.rb:125:in `assert_index': No such middleware to insert before: ActionDispatch::Static (RuntimeError)
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/actionpack-4.1.4/lib/action_dispatch/middleware/stack.rb:88:in `insert'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/configuration.rb:68:in `block in merge_into'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/configuration.rb:67:in `each'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/configuration.rb:67:in `merge_into'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/engine.rb:497:in `app'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/application/finisher.rb:36:in `block in <module:Finisher>'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/initializable.rb:30:in `instance_exec'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/initializable.rb:30:in `run'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/initializable.rb:55:in `block in run_initializers'
        from /Users/user1/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:226:in `block in tsort_each'
        from /Users/user1/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:348:in `block (2 levels) in each_strongly_connected_component'
        from /Users/user1/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:429:in `each_strongly_connected_component_from'
        from /Users/user1/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:347:in `block in each_strongly_connected_component'
        from /Users/user1/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:345:in `each'
        from /Users/user1/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:345:in `call'
        from /Users/user1/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:345:in `each_strongly_connected_component'
        from /Users/user1/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:224:in `tsort_each'
        from /Users/user1/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/tsort.rb:203:in `tsort_each'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/initializable.rb:54:in `run_initializers'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/application.rb:300:in `initialize!'
        from /Users/user1/Documents/rails/directory-project/demosite.com/config/environment.rb:5:in `<top (required)>'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/polyglot-0.3.5/lib/polyglot.rb:65:in `require'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/polyglot-0.3.5/lib/polyglot.rb:65:in `require'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/activesupport-4.1.4/lib/active_support/dependencies.rb:247:in `block in require'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/activesupport-4.1.4/lib/active_support/dependencies.rb:232:in `load_dependency'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/activesupport-4.1.4/lib/active_support/dependencies.rb:247:in `require'
        from /Users/user1/Documents/rails/directory-project/demosite.com/config.ru:3:in `block in <main>'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/rack-1.5.3/lib/rack/builder.rb:55:in `instance_eval'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/rack-1.5.3/lib/rack/builder.rb:55:in `initialize'
        from /Users/user1/Documents/rails/directory-project/demosite.com/config.ru:in `new'
        from /Users/user1/Documents/rails/directory-project/demosite.com/config.ru:in `<main>'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/rack-1.5.3/lib/rack/builder.rb:49:in `eval'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/rack-1.5.3/lib/rack/builder.rb:49:in `new_from_string'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/rack-1.5.3/lib/rack/builder.rb:40:in `parse_file'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/rack-1.5.3/lib/rack/server.rb:277:in `build_app_and_options_from_config'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/rack-1.5.3/lib/rack/server.rb:199:in `app'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/commands/server.rb:50:in `app'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/rack-1.5.3/lib/rack/server.rb:314:in `wrapped_app'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/rack-1.5.3/lib/rack/server.rb:250:in `start'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/commands/server.rb:69:in `start'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/commands/commands_tasks.rb:81:in `block in server'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/commands/commands_tasks.rb:76:in `tap'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/commands/commands_tasks.rb:76:in `server'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/commands/commands_tasks.rb:40:in `run_command!'
        from /Users/user1/.rvm/gems/ruby-2.2.1/gems/railties-4.1.4/lib/rails/commands.rb:17:in `<top (required)>'
        from bin/rails:8:in `require'
        from bin/rails:8:in `<main>'

具体来说,在我的development.rb文件中,我有以下与资产相关的设置:

# Disable Rails's static asset server (Apache or nginx will already do this).
config.serve_static_assets = false

# Do not fallback to assets pipeline if a precompiled asset is missed.
config.assets.compile = false

# Generate digests for assets URLs.
config.assets.digest = false

任何帮助都将不胜感激。


1
你有任何自定义中间件或者添加新中间件的 gem 吗? - Rishav Rastogi
我不这么认为。我从未涉及过中间件。 - newUserNameHere
1个回答

2
问题出在我的engine.rb文件中(我正在运行一个自定义 gem 中的 rails 引擎)。
app.middleware.insert_before(::ActionDispatch::Static, ::ActionDispatch::Static, "#{root}/public")

我使用这个if语句包装了这行代码,现在一切正常:

if Rails.application.config.serve_static_assets 
  app.middleware.insert_before(::ActionDispatch::Static, ::ActionDispatch::Static, "#{root}/public")
end

1
看吧,我说过你在某个地方搞中间件的事情 :). 不管怎样,很高兴你找到了解决方法 :) - Rishav Rastogi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接