rubyonrails&;用符号调用方法的基本问题

rubyonrails&;用符号调用方法的基本问题,ruby,ruby-on-rails-3,symbols,Ruby,Ruby On Rails 3,Symbols,出于某种原因,我还没有完全了解Rails如何与Ruby交互/了解Ruby本身 我会说到点子上的。例如,在Ruby on Rails项目中,您可能会遇到如下情况: class Product < ActiveRecord::Base default_scope :order => 'title' end 我知道它的作用,但它的语法让我大吃一惊。首先,看起来符号用于静态重用字符串值,但这里我们在。。。那要去哪里?那么我们是一个符号中的一个符号吗?这基本上是一个散列中的散列还是它到底在做

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

我会说到点子上的。例如,在Ruby on Rails项目中,您可能会遇到如下情况:

class Product < ActiveRecord::Base
default_scope :order => 'title'
end
我知道它的作用,但它的语法让我大吃一惊。首先,看起来符号用于静态重用字符串值,但这里我们在。。。那要去哪里?那么我们是一个符号中的一个符号吗?这基本上是一个散列中的散列还是它到底在做什么?我只是想在我的大脑中找到它,以便真正理解发生了什么

default_scope :order => 'title'
是一个方法调用

default_scope( {:order => 'title'} )
在这种情况下,Ruby允许您省略括号和大括号

validates :price, :numericalcity => {:greater_than_or_equal_to => 0.01 }
意味着

是一个方法调用

default_scope( {:order => 'title'} )
在这种情况下,Ruby允许您省略括号和大括号

validates :price, :numericalcity => {:greater_than_or_equal_to => 0.01 }
意味着


您正确地假设
default\u scope
是从ActiveRecord::Base继承的方法。转到查看
default\u范围的源代码

它是一种将可选哈希作为唯一参数的方法

这个,

和写它一样

default_scope( { :order => 'title' } )
在ruby中,如果方法的定义如下:

def foobar(options = {})
  p options
end
但是要注意语法上的细微差别。上面,如果您省略了
()
保留
{}
,ruby会将其理解为完全不同的东西。Ruby看到一个方法
default\u scope
,它接受
代码块作为参数

default_scope { # code block }
此方法定义如下所示:

def foobar(&block)
  yield
end
了解ruby块是如何工作的

你可以这样称呼它

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

您正确地假设
default\u scope
是从ActiveRecord::Base继承的方法。转到查看
default\u范围的源代码

它是一种将可选哈希作为唯一参数的方法

这个,

和写它一样

default_scope( { :order => 'title' } )
在ruby中,如果方法的定义如下:

def foobar(options = {})
  p options
end
但是要注意语法上的细微差别。上面,如果您省略了
()
保留
{}
,ruby会将其理解为完全不同的东西。Ruby看到一个方法
default\u scope
,它接受
代码块作为参数

default_scope { # code block }
此方法定义如下所示:

def foobar(&block)
  yield
end
了解ruby块是如何工作的

你可以这样称呼它

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

您的示例是错误的:
default\u范围{:order=>'title'}
被视为一个块而不是散列参数。您应该编写
default\u范围({:order=>'title'})
您的示例是错误的:
default\u范围{:order=>'title'}
被认为是块而不是散列参数。您应该编写
default\u范围({:order=>title})