Ruby on Rails&使用符号基本问题调用方法

时间:2011-08-04 05:03:11

标签: ruby ruby-on-rails-3 symbols

出于某种原因,我还没有完全理解Rails如何与Ruby交互/想出Ruby本身。

我会明白这一点。例如,在Ruby on Rails项目中,您可能会遇到类似这样的事情:

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

这让我感到困惑。我假设我们正在调用default_scope方法,该方法继承自ActiveRecord基类......所以我们可以设置一些选项。我们将符号传递给它:order =&gt; '标题'。是:在default_scope函数中只是一个哈希值,它将该哈希值设置为'title'?我能正确地做到这一点。

另外,例如,当您开始抛出基本验证时,您会得到类似这样的内容

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

我知道这是做什么的,但它的语法让我大吃一惊。首先,它看起来像符号用于静态重用的字符串值,但在这里我们发送一个动态符号...在哪里去?然后我们是符号中的符号吗?这基本上是哈希中的哈希还是它到底在做什么?我只是想在我的大脑中追踪它,以真正了解正在发生的事情。

2 个答案:

答案 0 :(得分:5)

假设default_scope是一个继承自ActiveRecord :: Base的方法,你是正确的。转到here查看default_scope的源代码。

这是一种采用可选哈希作为唯一参数的方法。

此,

default_scope :order => 'title'

与将其编写为

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

在ruby中,如果方法被定义为,

def foobar(options = {})
  p options
end

提防语法上的细微差别。上面,如果你遗漏(){}红宝石将其理解为完全不同的东西。 Ruby看到一个方法default_scope,它接受​​code block作为它的参数。

default_scope { # code block }

此方法定义如下,

def foobar(&block)
  yield
end

了解ruby如何阻止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

答案 1 :(得分: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 } } )