Ruby rainbows 疑问,求教!!!

wangping · 2014年07月05日 · 最后由 wangping 回复于 2014年07月07日 · 2287 次阅读

Gemfile 里面: gem 'rainbows', '~> 4.6.2'

然后 config.ru 里面:

require 'bundler'
Bundler.require
Rainbows::Configurator::Rainbows! do
  use :ThreadSpawn # concurrency model to use
  worker_connections 40
  keepalive_timeout 0 # zero disables keepalives entirely
  client_max_body_size 5*1024*1024 # 5 megabytes
  keepalive_requests 666 # default:100
  client_header_buffer_size 2 * 1024 # 2 kilobytes
end

居然报错 undefined method `Rainbows!' for Rainbows::Configurator:Module (NoMethodError)

我就纳闷了,既然调用到了 Rainbows::Configurator 这个模块说明 gem 引用成功啦,怎么里面的方法不对????求大婶解惑或者说说可能的原因~~

楼主用法有错。。

This module adds Rainbows! to the Unicorn::Configurator Rainbows!-specific configuration options must be inside a the Rainbows! block, otherwise Unicorn::Configurator directives may be used anywhere in the file.

Rainbows! do
  use :ThreadSpawn # concurrency model to use
  worker_connections 400
  keepalive_timeout 0 # zero disables keepalives entirely
  client_max_body_size 5*1024*1024 # 5 megabytes
  keepalive_requests 666 # default:100
  client_header_buffer_size 2 * 1024 # 2 kilobytes
end

# the rest of the Unicorn configuration...
worker_processes 8
stderr_path "/path/to/error.log"
stdout_path "/path/to/output.log"

楼主仔细看下代码

module Rainbows::Configurator
# ...
  # Configures \Rainbows! with a given concurrency model to +use+ and
  # a +worker_connections+ upper-bound.  This method should be called
  # inside a Unicorn/\Rainbows! configuration file.
  #
  # All other methods in Rainbows::Configurator must be called
  # inside this block.
  def Rainbows!(&block)
    block_given? or raise ArgumentError, "Rainbows! requires a block"
    @block = true
    instance_eval(&block)
    ensure
      @block = false
  end
# ...
end
# :enddoc:
# inject the Rainbows! method into Unicorn::Configurator
Unicorn::Configurator.__send__(:include, Rainbows::Configurator)

可以看到Rainbows!方法不是定义在 Rainbows::Configurator 上的 module 级方法,而是实例方法,所以肯定不是这么调用的。

嗯嗯,我想也是这个问题,关键是 new 不了,不知道咋办

#1 楼 @iBachue 我也试过用

class A
  include Rainbows::Configurator
end

r = A.new
r.Rainbows! do
  use :ThreadSpawn # concurrency model to use
  worker_connections 40
  keepalive_timeout 0 # zero disables keepalives entirely
  client_max_body_size 5*1024*1024 # 5 megabytes
  keepalive_requests 666 # default:100
  client_header_buffer_size 2 * 1024 # 2 kilobytes
end

报错: undefined local variable or method `set' for #<0x000000036cbc38>0x000000036cbc38>

#1 楼 @iBachue 我看一般的都是可以用的


module M  
  def my_method  
    'M#my_method()'  
  end  
end  
class C  
  include M  
end  
class D < C; end  
p D.new.my_method() # => "M#my_method()"  
p D.ancestors # => [D, C, M, Object, Kernel, BasicObject]  

#2 楼 @wangping 楼主按文档上的来呀。。

文档上的没有说~~~ 就下面几句

Configuration File(s)
Rainbows! will look for the config.ru file used by rackup in APP_ROOT.

For deployments, it can use a config file for Unicorn and Rainbows!-specific options specified by the --config-file/-c command-line switch. Rainbows! accepts all options found in Unicorn::Configurator as well as the Rainbows! block, so you can have the following in your config file:

worker_processes 4 # assuming four CPU cores
Rainbows! do
  use :FiberSpawn
  worker_connections 100
end
See the Rainbows! configuration documentation for more details.

我不知道缺了啥?

上面说和 Unicorn 差不多嘛。。楼主先创建一个config/unicorn.rb,然后把配置文件写进去,对于 Rainbow 特有的选项,放在Rainbows!代码块里,应该是这个意思吧。反正我以前是这么用 Unicorn 的。。

哦哦,我没用过 unicorn,我试试吧

rainbow 是容器,app(config.ru)是容器装的内容 你好像不应该把 Rainbow!放在 config.ru 里,就像小心轻放的标签是打在外包装盒上而不是内里面东西上一样

你应该写一个 config/rainbow.rb 写 i 婶写在 config/unicorn.rb 然后用 rainbows -c ./config/rainbow.rb -E production -D 来启动

9 楼 已删除

#8 楼 @azhao 3q,其实我纠结的是-c ./config/rainbow.rb 这句,其他的所有我都试过了,原来我少加了一句

#8 楼 @azhao Rainbows!是实例方法,那它的实例是怎么来的?

rainbows 启动的时候会实例化,具体可以看 rainbows 代码

#12 楼 @azhao 哦,好的,谢谢,我在仔细看看

需要 登录 后方可回复, 如果你还没有账号请 注册新账号