无法在 rails 5.0 上提供静态资产。 "super: no method `silence` for #<Logger:0x00000004bd78c0>"
Unable to serve static assets on rails 5.0. "super: no method `silence` for #<Logger:0x00000004bd78c0>"
我很迷茫,所以我不完全确定哪些信息对这个问题有用,但我正在尝试为 rails 中的 angular 应用程序提供一些静态资产],包括作为我自己的和第三方的 JS,HTML,和 CSS。我在 assets
下创建了一个名为 third_party
的目录,我所有的 Bower 安装组件都放在该目录中,并为我自己的客户端代码创建了一个名为 my_app
的目录。
我需要 app/assets/javascript
中的 main_app.js
文件中的必要代码:
//= require jquery
//= require jquery_ujs
//= require angular/angular
<snipped>
//= require_tree ../my_app/common
//= require main/index/index
//= require_tree ../my_app/main
我使用这些行将这些目录添加到我的 application.rb
文件中的资产路径:
config.assets.paths << Rails.root.join('app', 'assets', 'third_party')
config.assets.paths << Rails.root.join('app', 'assets', 'main_app')
并将它们添加到 assets.rb
中的预编译步骤:
Rails.application.config.assets.precompile += %w( main_app.js )
最后,我有一个通过自定义 assets_controller
提供的资产,如下所示:
class AssetsController < ApplicationController
skip_before_filter :verify_authenticity_token
def serve_main_asset
serve_asset_for_app("main")
end
protected
def serve_asset_for_app(app_name)
path = params[:path]
respond_to do |format|
format.html { render :file => "app/assets/my_app/#{app_name}/#{path}.html", layout:
false }
format.js { render :file => "#{path}.js" }
format.css { render(:file => "#{path}.css") }
format.json { render(:file => "app/assets/my_app/#{app_name}/#{path}.json") }
end
end
end
但是每当我尝试 GET
这些文件中的任何一个时,我都会看到这个 error/stacktrace:
2016-08-04 01:23:16 -0500: Rack app error handling request { GET /assets/main/index/index.html }
#<NoMethodError: super: no superclass method `silence' for #<Logger:0x00000004bd78c0>>
/home/pawan/.rvm/gems/ruby-2.2.3/gems/activesupport-5.0.0/lib/active_support/logger.rb:63:in `block (3 levels) in broadcast'
...
在一条可能相关的说明中,我注意到该应用程序还在尝试提供具有唯一文件名的资产,即使我认为我已为开发模式关闭了所有缓存清除逻辑。 (例如:bootstrap.self-c8d853976ca268a5391a9470ebdcf3ba43e0b78936cdc925146afcb60a3116be.js
)
我觉得这个问题可能只是某种过时的 gem? TIA.
我遇到了同样的问题。
问题是我使用了普通的 Ruby 记录器 (config/environmens/development.rb):
config.logger = Logger.new('/dev/null')
为了使其正常工作,我将其更改为使用 ActiveSupport 记录器:
config.logger = ActiveSupport::Logger.new('/dev/null')
这对我有用。
这是因为 sprockets-rails gem 最近发生了一些变化,现在提供了一个配置选项来抑制开发中的资产请求日志记录。
您可以通过设置以下配置在 development.rb
中禁用资产日志记录。
config.assets.quiet = false
或改用ActiveSupport::Logger
。
config.logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT))
我很迷茫,所以我不完全确定哪些信息对这个问题有用,但我正在尝试为 rails 中的 angular 应用程序提供一些静态资产],包括作为我自己的和第三方的 JS,HTML,和 CSS。我在 assets
下创建了一个名为 third_party
的目录,我所有的 Bower 安装组件都放在该目录中,并为我自己的客户端代码创建了一个名为 my_app
的目录。
我需要 app/assets/javascript
中的 main_app.js
文件中的必要代码:
//= require jquery
//= require jquery_ujs
//= require angular/angular
<snipped>
//= require_tree ../my_app/common
//= require main/index/index
//= require_tree ../my_app/main
我使用这些行将这些目录添加到我的 application.rb
文件中的资产路径:
config.assets.paths << Rails.root.join('app', 'assets', 'third_party')
config.assets.paths << Rails.root.join('app', 'assets', 'main_app')
并将它们添加到 assets.rb
中的预编译步骤:
Rails.application.config.assets.precompile += %w( main_app.js )
最后,我有一个通过自定义 assets_controller
提供的资产,如下所示:
class AssetsController < ApplicationController
skip_before_filter :verify_authenticity_token
def serve_main_asset
serve_asset_for_app("main")
end
protected
def serve_asset_for_app(app_name)
path = params[:path]
respond_to do |format|
format.html { render :file => "app/assets/my_app/#{app_name}/#{path}.html", layout:
false }
format.js { render :file => "#{path}.js" }
format.css { render(:file => "#{path}.css") }
format.json { render(:file => "app/assets/my_app/#{app_name}/#{path}.json") }
end
end
end
但是每当我尝试 GET
这些文件中的任何一个时,我都会看到这个 error/stacktrace:
2016-08-04 01:23:16 -0500: Rack app error handling request { GET /assets/main/index/index.html }
#<NoMethodError: super: no superclass method `silence' for #<Logger:0x00000004bd78c0>>
/home/pawan/.rvm/gems/ruby-2.2.3/gems/activesupport-5.0.0/lib/active_support/logger.rb:63:in `block (3 levels) in broadcast'
...
在一条可能相关的说明中,我注意到该应用程序还在尝试提供具有唯一文件名的资产,即使我认为我已为开发模式关闭了所有缓存清除逻辑。 (例如:bootstrap.self-c8d853976ca268a5391a9470ebdcf3ba43e0b78936cdc925146afcb60a3116be.js
)
我觉得这个问题可能只是某种过时的 gem? TIA.
我遇到了同样的问题。
问题是我使用了普通的 Ruby 记录器 (config/environmens/development.rb):
config.logger = Logger.new('/dev/null')
为了使其正常工作,我将其更改为使用 ActiveSupport 记录器:
config.logger = ActiveSupport::Logger.new('/dev/null')
这对我有用。
这是因为 sprockets-rails gem 最近发生了一些变化,现在提供了一个配置选项来抑制开发中的资产请求日志记录。
您可以通过设置以下配置在 development.rb
中禁用资产日志记录。
config.assets.quiet = false
或改用ActiveSupport::Logger
。
config.logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT))