2011-08-04 82 views
1

出于某种原因,我还没有完全明白Rails如何与Ruby进行交互/弄清楚了Ruby本身。Ruby on Rails&调用带有符号的方法基本问题

我会说点。例如,在一个Ruby on Rails项目中,你可能有这样的事情:

class Product < ActiveRecord::Base 
default_scope :order => 'title' 
end 

这让我很困惑。我假设我们正在调用产品从基类ActiveRecord类继承的方法default_scope ...以便我们可以设置一些选项。我们传递它的符号:order =>'title'。是:在default_scope函数中只订购一个散列值,并将该散列值设置为“title”?我得到了正确的。

又例如,当你开始扔基本验证在你得到这样的事情

validates :price, :numericalcity => {:greater_than_or_equal_to => 0.01 } 

我知道这是什么一样,但它的语法吹拂我的心灵。首先,它看起来像符号用于静态重用字符串值,但在这里我们发送一个动态符号...在哪里呢?然后我们是符号内的符号吗?这基本上是一个哈希内的散列或它到底是什么?我只是想在我的大脑中找出它来真正理解正在发生的事情。

回答

5

您在假设default_scope是一个方法,它是从ActiveRecord的::基地继承正确。前往here查看default_scope的源代码。

这是一种采用可选散列的方法,因为它只是参数

此,

default_scope :order => 'title' 

相同写入它作为,

default_scope({ :order => 'title' }) 

在红宝石如果一个方法是像定义,

def foobar(options = {}) 
    p options 
end 

但是提防的语法细微差别。在上面,如果你遗漏了()保持{} ruby​​理解它是完全不同的东西。 Ruby看到一个方法default_scope,它接受code block作为参数。

default_scope { # code block } 

这种方法定义的样子,

def foobar(&block) 
    yield 
end 

要了解如何块红宝石工作read this

你可以这样调用它,

foobar :key_1 => 'value_1', "key_2" => 'value_2' 

和Ruby的理解它是,

foobar({ :key_1 => 'value_1', "key_2" => 'value_2' }) 

哈希的按键可能会或可能不会符号。

至于该列属性price验证辅助方法,

validates :price, :numericality => { :greater_than_or_equal_to => 0.01 } 

相同,

validates(:price, { :numericality => { :greater_than_or_equal_to => 0.01 } }) 

这类似于一个方法定义等,

def validates(column_attr, options = {}) 
    # perform validation of column_attr 
end 
0
default_scope :order => 'title' 

是一个方法调用

default_scope({:order => 'title'}) 

的Ruby允许省略括号和大括号在这种情况下。

validates :price, :numericalcity => {:greater_than_or_equal_to => 0.01 } 

装置

validates(:price, {:numericalcity => {:greater_than_or_equal_to => 0.01 } }) 
+4

你的例子是错误的:'default_scope {:order =>'title'}'被认为是一个块而不是散列参数。你应该写'default_scope({:order =>'title'})' – juandebravo