首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >digest_path & asset_digest_path不允许摘要URL

digest_path & asset_digest_path不允许摘要URL
EN

Stack Overflow用户
提问于 2014-04-12 18:08:21
回答 1查看 560关注 0票数 0

我的资产投入生产,这段时间过得很艰难。我想要覆盖sprokets助手模块来看看发生了什么.当我把它改写成以下内容时:

代码语言:javascript
复制
module Sprockets
  module Rails
    module Helper
      def compute_asset_path(path, options = {})

它不会跑的。我在我当地的环境里试过了,它运行得很好。为什么生产环境不允许我的资产以摘要形式呈现,而我的本地环境却允许?这和这位绅士的要求有关..。

sync

下面是在试图重写该方法(该方法在使用RAILS_ENV=development运行时没有错误)后收到的错误:

代码语言:javascript
复制
ActionView::Template::Error (undefined local variable or method `digest_path' for #<#<Class:0x000001034a99e0>:0x000001034a81d0>):

Gemfile中的资产宝石供参考:

代码语言:javascript
复制
source 'http://rubygems.org'
# ruby '2.1.1'

gem 'rails', '4.0.4'
gem 'jbuilder', '~> 1.2'
gem 'devise'
gem 'devise_invitable'
gem 'figaro'
gem 'mysql2'
gem 'simple_form'
gem 'kaminari'
gem 'statistics'
gem 'possessive'
gem 'geocoder'
gem 'nokogiri'
gem 'asset_sync'
gem 'sprockets-rails', :require => 'sprockets/railtie'
gem 'ledermann-rails-settings', :require => 'rails-settings'
gem 'public_activity'

group :assets do
  gem 'therubyracer'
  gem 'sass-rails', '~> 4.0.0'
  gem 'uglifier', '>= 1.3.0'
  gem 'coffee-rails', '~> 4.0.0'
end

group :development do
  gem 'better_errors'
  gem 'binding_of_caller', :platforms=>[:mri_19, :mri_20, :rbx]
  gem 'guard-bundler'
  gem 'guard-rails'
  gem 'quiet_assets'
  gem 'rails_layout'
  gem 'rb-fchange', :require=>false
  gem 'rb-fsevent', :require=>false
  gem 'rb-inotify', :require=>false
end

group :test do
  gem 'email_spec', '>= 1.4.0'
  gem 'launchy', '>= 2.2.0'
  gem 'capybara', '>= 2.0.3'
  gem 'database_cleaner', '>= 1.0.0.RC1'
  gem 'cucumber-rails', '>= 1.3.1', :require => false
end

group :production do
  gem 'rails_12factor'
end

gem 'rspec-rails', '>= 2.12.2', :group => [:development, :test]
gem 'factory_girl_rails', '>= 4.2.0', :group => [:development, :test]
gem 'teaspoon', '>= 0.7.4', :group => [:development, :test]
gem 'cancan', '>= 1.6.9'
gem 'rolify', '>= 3.2.0'
gem 'stripe-rails'
gem 'faker'
gem 'open4'
gem 'unf'

当我在开发模式下运行它时,它运行的非常好。当我通过生产模式(即使使用相同的配置文件)运行它时,它不会继承digest_pathasset_digest_path是null或manifest等视图属性。

代码语言:javascript
复制
module Sprockets
  module Rails
    module Helper

      def compute_asset_path(path, options = {})
        if digest_path = asset_digest_path(path)
          path = digest_path if true # BUG: digest assets doesn't work on live, let's just bake it
          path += "?body=1" if options[:debug]
          File.join(assets_prefix || "/", path)
        else
          super
        end
      end

      def asset_digest_path(path, options = {})
        if manifest = assets_manifest
          if digest_path = manifest.assets[path]
            return digest_path
          end
        end

        if environment = assets_environment
          if asset = environment[path]
            return asset.digest_path
          end
        end
      end

    end
  end
end

module ActionView
  module Helpers
    module AssetUrlHelper
      def compute_asset_path(source, options = {})
        dir = ASSET_PUBLIC_DIRECTORIES[options[:type]] || ""
        File.join(dir, source)
      end
    end
  end
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-13 06:25:17

希望这能帮助我的程序员朋友们节省一些脑筋:D

当我将文件上传到S3时,我没有意识到清单不是由Rails加载的。您可以正确设置所有生产设置(如上面和其他线程中的设置),但如果没有Rails可读的manifest.json文件,它仍然会生成/javascript/* (例如) urls。

我仍然在使用multi_json gem的最新版本时遇到了麻烦,所以我将其降级到1.7.8级,并且运行良好。

代码语言:javascript
复制
gem 'multi_json', '1.7.8'

这样它就可以读取rake assets:precompile创建的rake assets:precompile文件。

关于这个链轮线程https://github.com/rails/sprockets-rails/issues/107,关于清单文件应该在git中还是仅在部署脚本上,做最适合您的事情,只需确保它可以在以下文件中找到就可以了:

代码语言:javascript
复制
/public/assets/manifest.json 

或者是你自己做的

代码语言:javascript
复制
config.assets.manifest = '...'

这可能会或不会被贬低。

干杯!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23034184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档