我是ruby on rails的新手,任何人都可以解释符号':'是什么意思,什么是'validates'和'create_table'?这么多困惑......
class Post < ActiveRecord::Base
validates :name, :presence => true
validates :title, :presence => true, :length => {:minimum => 5}
end
class CreatePosts < ActiveRecord::Migration
def change
create_table :posts do |t|
t.string :name
t.string :title
t.text :content
t.timestamps
end
end
end
答案 0 :(得分:6)
冒号字符(:
)是Ruby“符号”的语法文字的开头:
:abc.class # => Symbol "abc".to_sym # => :abc
符号就像字符串,但它们是“实习”,这意味着Ruby解释器在内存中只有一个副本,尽管存在多个可能的引用(而在内存中可能同时存在许多等效的字符串)。
< / LI>上面示例中的“validates
”标记是一个类方法(“Post类”的类层次结构中的某个类),使用符号参数调用({{1} })和一个哈希参数,其中一个键/值对为:name
。
':presence => true
'标记是一个使用单个参数(符号“create_table
”)调用的方法,并且给出了一个块采用单个参数“t”(:posts
)。
答案 1 :(得分:1)
在Ruby中,:
表示它是一个符号。 Symbol有点像一个轻量级字符串,专门用作标识符。例如,在散列中,您使用符号作为指向其各自值的键。
my_hash = {:key_1 => "A", :key_2 => "B"}
在上面的示例中,您使用符号指定Post模型的属性和posts表的列。
以下是进一步阅读Ruby符号的一些链接:
答案 2 :(得分:1)
:foo
是符号,即保证唯一的常量字符串。它们经常在Ruby中用于引用字段或方法。
validates
来设置字段值的约束。
validates :name, :presence => true
表示必须始终为name
的所有实例(以及DB中的相应表)设置字段Post
(不为空,未定义或为空)。 validates :title, :presence => true, :length => {:minimum => 5}
表示必须始终设置字段title
,且其长度必须大于5。
答案 3 :(得分:1)
:foo是一个“符号”,它本质上是一个不可变的字符串。它的主要优点是每次使用它时都不会分配新对象。如果每次需要使用它时都使用字符串“name”,那么每次都会创建一个新的String对象。但是,如果您使用:name,则每次都使用相同的Symbol对象(在指针相等性和对象标识方面相同)。
validates和create_table都是方法。在ruby中,方法在调用时不需要括号,因此验证:foo与validates(:foo)相同。这些方法来自继承和模块mixins。 validates是在继承期间放入ActiveRecord对象的类方法,而create_table是一个实例方法
答案 4 :(得分:1)
Ruby Documentation和Ruby on Rails Documentation:
“符号:
是什么意思?” Class:Symbol
Symbol对象表示Ruby解释器中的名称和一些字符串。它们是使用:name和:“string”文字语法以及各种to_sym方法生成的。无论该名称的上下文或含义如何,都将在程序执行期间为给定名称或字符串创建相同的Symbol对象。因此,如果Fred是一个上下文中的常量,另一个中的方法,以及第三个中的类,则Symbol:Fred将在所有三个上下文中都是相同的对象。
“什么是validates
?” ActiveModel::Validations::ClassMethods
此方法是所有默认验证器和以“Validator”结尾的任何自定义验证程序类的快捷方式。请注意,通过在其位置创建自定义验证程序类(如PresenceValidator),可以在特定类中覆盖Rails默认验证程序。
“什么是create_table
?” ActiveRecord::ConnectionAdapters::SchemaStatements
创建一个新表
(该链接显示示例,显示此方法生成的SQL语句。)
答案 5 :(得分:0)
@Grimm
正如您应该知道的,一切都是RoR上的对象。在某些情况下,您需要区分String与其他String,因为String的内存处理技术与其他数据结构不同。科隆:是考虑这种类型的一种形式。它们只是在内存中进行哈希输入的符号!
习惯了,它会很有趣! :)
答案 6 :(得分:0)
:
是符号的开头。符号对我来说简单是一个字符串或变量名。在您的示例中,:name
是一个变量/符号,它反映了Post表中的一个字段名称。创建Model类时,Rails会自动创建这些符号。
在Ruby中,您可以调用方法/函数并使用/不使用括号指定其参数。所以,
验证:name,:presence =&gt;真
可以写成
验证(:name,:presence =&gt; true)
因此,您实际上已将:name
和true
作为validates
方法
希望这有助于您更清楚地了解Ruby中调用的方法。
与验证相同,create_table也是一种方法。
答案 7 :(得分:0)
除了符号之外,这里需要注意的是,在Ruby中,我们不必隐式地给{}指定如果参数是最后一个参数,则参数是哈希。我的意思是打电话给
validates :name, :presence => true
你正在打电话
validates :name, {:presence => true}
或
validates(:name, {:presence => true})
然后很明显,您正在使用2个参数,符号和哈希调用方法validates
。如果我们忽略符号并替换字符串,就像这样:
validates("name", {"presence" => true})
它与任何其他语言的方法调用非常相似。因此,请注意这一点,因为它几乎用在Rails使用的每个帮助程序标记中。
对于其他方法,您也可以看到:
validates(:title, {:presence => true, :length => {:minimum => 5}})
在create_table
的情况下,它是一个带有2个参数的方法调用,一个符号和一个块。