2012-06-03 46 views
2

我看到如下所示的红宝石代码。这似乎是创建配置或设置的一种习惯用语,但我并不真正了解它。此外,该代码的Application.configure部分将如何查看?这个红宝石代码如何工作设置配置

MyApp::Application.configure do 
    config.something = foo 
    config..... 
    config.... 
    . 
    config.... 
end 
+1

你知道你可以看看来源,对吗? :) –

+0

是的,但是对于像我这样的初学者来说,rails的源代码并不是一件容易的事情。我也不确定这是实际的工作代码还是我看到的样本。 – Brand

+0

我没有使用过Rails,所以我不能肯定地说,但它可能在'instance_eval'的范围内执行,它定义了一个名为'config'的变量。 – Linuxios

回答

4

首先,该配置方式不是特定于Ruby的;它是选择使用它的应用程序(或库,宝石)。

解释你又有什么代码做的,我相信你的代码片段为例:

MyApp::Application.configure do 
    config.something = foo 
end 

在这里,你在呼唤MyApp::Application.configure方法,不带参数。通话结束后,您可以给它区块

您可以将块想象为您可以使用的一段代码。
他们可以在一个单行或多个这样写:

{ puts 'hello' } 
{ |param| puts param } # with passing it a param 

# or 

do |param| 
    puts param 
end 

(?记得my_array.each do ... end这是你传递一个块;))

现在,该块将在configure方法由于内部调用到yield

yield使用(或执行)已传递给方法的块的指令。

例子:让我们定义的方法与它内部的产率:

def hello 
    puts "Hello #{yield}" 
end 

如果调用此方法,你会得到一个'hello': no block given (yield) (LocalJumpError)'

您需要通过一个块:hello { :Samy }
结果将是Hello Samy。正如你所看到的,它只是使用传递给该方法的块中的内容。

这正是Rails配置代码中发生的情况。您只需将config.somethingconfig是一种方法)设置为某个值,并且相同的config.something = fooconfigure内执行。

您可以了解更多关于yieldhere,并在此great book

2

的部分从“做”直到“结束”被称为块,并且获得通过向configure类方法上Application。 (所有的ruby方法都可以接受参数和块)

所以Application.configure方法是用一组默认值创建一个配置对象,然后调用该块。然后该块设置您看到的值,具有覆盖它们的效果。

然后将该配置对象设置为类变量(如全局变量),以便其他类可以稍后在应用程序生命周期中使用该配置对象。

希望简化说明有帮助!