【问题标题】:Async Rails 3.1 problem with assets资产的异步 Rails 3.1 问题
【发布时间】:2011-09-05 19:13:44
【问题描述】:

我在异步 Rails 3.1 应用程序上遇到了资产问题,我设法构建了一个显示我的问题的最小示例,但它对我没有多大帮助。

应用程序非常简单,我所做的是: - 使用 3.1(非 rc)创建一个全新的应用程序 - 添加thin+Rack::FiberPool - 设置波旁威士忌(scss mixins) - 运行应用程序

现在我用“rails server thin”启动一个服务器,之后任何请求都会以“堆栈级别太深”结束,只有一个回溯行:/

这是最小的应用程序:https://github.com/schmurfy/assets_crash

这是我在执行请求时得到的回溯: http://dl.dropbox.com/u/1313066/github/crash_assets.png

我试图深入了解问题出在哪里,导致我在文件 template_handlers.rb 中使用 sass-rails:

def sass_options(scope)
  importer = self.importer(scope)
  options = sass_options_from_rails(scope)
  load_paths = (options[:load_paths] || []).dup
  load_paths.unshift(importer)
  # bnding.pry
  options.merge(
    :filename => eval_file,
    :line => line,
    :syntax => syntax,
    :importer => importer,
    :load_paths => load_paths,
    :custom => {
      :resolver => Resolver.new(scope)
    }
  )
end

我尝试使用 Pry(一种 irb 替代方案)进行探索,但我发现更令人费解的是:在 binding.pry 行中,我可以触发堆栈级别太深:

{}.merge(:anything => Resolver.new(scope))

结果是立竿见影的,但我在那个对象中找不到任何可以解释结果的东西。

欢迎任何线索。

【问题讨论】:

  • 您是否对系统进行了某些操作以显示光纤堆栈已溢出 (4kb),或者您是否在文档中找到?
  • 起初这是一个想法,后来被redmine.ruby-lang.org/issues/3187 证实。在那之后只是为了确定我编译了一个自定义 ruby​​ 1.9.2,在其中我更改了定义堆栈大小的常量(我很快就找到了它,因为我知道要搜索什么)并且我的测试应用程序使用它:/

标签: asynchronous ruby-on-rails-3.1 eventmachine ruby-1.9.2


【解决方案1】:

我终于找到了答案:fiber 只有 4Kb 的堆栈空间,而 Ruby on Rails 现在太大了,无法容纳这个空间:/

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,将我的 ruby​​ 升级到 1.9.3-preview1 并从头开始构建我所有的 gem,现在一切正常。

    编辑: 好吧,在玩了一会儿之后,看起来好像是 Rack::Fiberpool 导致了这个问题。在我将 Rack::Fiberpool 插入到我的 Rails 堆栈中后得到它......

    【讨论】:

      【解决方案3】:

      在 Rails 中禁用资产管道。不需要 sass-rails,而是需要 Gemfile 中的 sass 和 sprockets。这是我用于服务资产的 config.ru:

      require ::File.expand_path('../config/environment',  __FILE__)
      
      Sass::Engine::DEFAULT_OPTIONS[:load_paths].tap do |load_paths|
        load_paths << "app/assets/stylesheets"
        load_paths << Compass::Frameworks['compass'].stylesheets_directory
        load_paths << Compass::Frameworks['twitter_bootstrap'].stylesheets_directory
      end
      
      builder = Rack::Builder.new do
        map '/assets' do
          environment = Sprockets::Environment.new
          environment.append_path 'app/assets/javascripts'
          environment.append_path 'app/assets/stylesheets'
          run environment
        end
      
        map '/' do
          use Rack::FiberPool, :size => 250
          run YourApp::Application
        end
      end
      run builder
      

      它需要在生产环境中预编译资产。以后会看的。

      【讨论】:

      • 有趣的想法,从来没有想过这个。您是否设法使我的测试应用程序与此一起使用?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      相关资源
      最近更新 更多