一、语法速览
1.times、upto、downto、each、step
3.times {print "Hit!"} #Hi!Hi!Hi!
1.upto(9) {|i| print i if i<7} #123456
9.downto(1) {|i| print i if i<7} #654321
(1..9).each {|i| print i if i<7} #123456
0.step(11,3) {|i| print i} #0369
用一个例子总览前面学到过的知识:
#一个求50以内的素数算法,对ruby的进一步了解
$arr=[] #建立一个全局数组存储素数
$arr[0]=2 #1不是排除,从2开始
def add_prime(n) #定义一个方法
3.step(n,2){|num| $arr << num if is_prime?num} #从3开始到n的奇数(是否为素数)加入到$arr
end
def is_prime?(number) #判断一个奇数是否为素数
j=0 #从数组第一个开始
while $arr[j]*$arr[j] <= number
return false if number % $arr[j]==0
j += 1
end
return true
end
add_prime(50)
print $arr.join(","),"\n" #将数组转换成字符串输出
2.类以class关键字开头end结尾..类名必须以大写字母开头.即类名是一个常量(常量不可以定义在方法中).
3.以@开头的变量是实例变量,从属于某一个实例对象,只能在方法内部使用它.
4.initialize方法在构造实例对象时会被自动调用.
5.attr_reader(只读),attr_writer(只写),attr_acccessor(读写),attr : var,bool(true读写,false只读).
6.类变量和类方法
类变量名以'@@'开头和全局变量和实例变量不同,类变量在使用前必须初始化.
class Person
@@number = 0
def initialize(name,gender,age)
@name = name
@gender = gender
@age = age
@@number += 1
end
end
类变量是private,在类外无法直接访问,只能通过实例方法和类方法去访问它.同样,类方法是属于一个类的方法,定义类的方法时需要在方法前加上类名,如:
def Person.getNumber
return @@number
end
7.方法的存取控制
Public Method:在任何地方都可以被调用,默认情况下都是,除了:initialize和initialize_cpoy
Protected Method:只能被定义这个方法的类自己的对象和这个类的子类的对象访问.
Private Method:只能被定义这个方法的类的对象自己访问,即使是这个类的其他对象也不能访问.
8.数组
正常索引即可.-1表示最后一个元素,-2表示倒数第二个...依次类推.
a[1-5]索引值取数
a[1...5]也表示范围
9.Hash
哈希表类似于数组,每项有键值和对应的值.XX={key=>value......}.
9.string中'中的变量将不被替换,而"中的变量将被替换,可以在字符串中使用#{expr}嵌入代码.
10.Range对象
表示范围,有:..,...两种形式,前者包含最后一个元素,后者不包括.可用to_a方法将Range对象转化为Array对象.
当Range出现在条件语句中时,Range此时是一个双向开关:当第一个开关满足时打开开关,当第二个条件满足时关闭开关.如:
a = [1,2,3,4,5,6]
a.each do |i|
print i, " " if == 1..i == 5
end
将会输出:
1 2 3 4 5
还可以使用===来测试一个元素是否在某个范围:
(1...10) === 4 返回值为bool
还可以使用在case语句之内表示范围.
11.Regexp对象
正则表达式,使用/../或%r{...}生成Regexp类对象.
使用Regexp#match(string)方法或者=~元算符来匹配正则表达式,还可以使用!~来测试是否批匹配.在匹配正则表达式时,将匹配到的字符串放在$&变量中,$'变量中存放已经匹配过字符序列,$`变量中存放还未匹配的字符序列.
12.表达式:
if case的执行语句与条件放在同一行时需要使用then或者:
13.RUby中的模块
Module,模块不能有实例对象.
实现多继承的功能:mixin
二,Ruby On Rails
1.<% %>中间有'='表示中间的信息是需要被替换成文本显示的;而中间没有'='则表示中间的Ruby代码只被隐含的执行而不显示出来
2.对<% %>中会涉及到出现特殊字符串时,用h()方法进行转码.
3.Views模板可以访问Controllers中的任何实例变量.
4.Ruby On Rails执行的过程是对路径的路由解析.如:http://localhost:300/say/hello,将会被解析成调用say这个控制器的hello方法,相应地,会显示Views/say/hello.html.erb这个文件的html代码.
5.link_to可以创建一个指向一个action的超链接.未特别指明的情况下是指当前的控制器:<%= link_to "SomeStr", :action => "actionName" %>创建了一个指向actionName这个方法的超链接.
6.在app/views/layouts目录中创建了一个某个控制器同名的模板文件,那么该控制器所渲染的视图在默认状态下会使用此布局模板.渲染过后显示的主体内容是没有改变的,只是对某些方面做了修饰.
<%= yield :layout %>当调用yield方法并传入:layout时,Rails会自动在这里插入页面的内容--即原来所要显示的主体.其余部分则是渲染效果.
Rails还会将渲染action的结果赋值给@content_for_layout变量,因此可以直接插入该变量的值也能达到与yield同样的效果.
7.局部模板
可以将一个集合传递给负责渲染局部的方法,该方法就会自动地多次渲染局部模板---每次都传入集合中的一个元素作为参数.如:
<%= render(:partial => "action", :collection => @var) %>其中action就是负责局部渲染的方法(对应同一目录下的_action.html.erb),collection就是一个参数的集合.注意主模板在调用render方法时会使用跟action同名的一个局部变量.这个变量的值就是需要多次渲染的项目.
在布局模板中调用局部模板渲染自己:
render方法还有一个:object参数.他接受一个对象作为参数,并将其值赋值给一个与局部模板同名的变量.意思就是:若主模板中存在这种渲染:<%= render(:partial => "action", :object => @var) %>则在局部模板_action.html.erb中就会存在一个var的局部变量(注意是局部变量,而不是实例变量)这个变量的值就是@var这个实例变量的值.
二.常用的方法:
blank?判断对象是否为空,其中nil,false为true,当对象是字符串时需要去掉字符串两端的空串再进行比较.
group_by:groups = products.group_by {|product| product.name }按照product的name属性对products进行分组.
index_by方法接受一个集合作为参数,并将其转化为一个hash,语法同group_by:XX.index_by { |some| some.id }
sum可对一个集合进行加总的运算.
many?会判断集合中的元素是否多于一个.
数据库的四项基本操作CRUD(create,read,update,delete)
新建记录:
可以通过new方法创建一个对象实例.不过创建完毕后不要忘记了调用.save方法将改变存入到数据库中,因为new只是在内存中新建了一个实例对象.
另外ActiveRecord提供了一个更便利的方法create.能同时完成新建实例对象并且将实例对象存入数据库中.
共同点:两个方法都能接受hash作为参数.这样就可以直接拿表单数据来构造模型对象.
order = Order.new(params[:order])
读取现有的记录:
find方法,该方法接受一个或多个主键作为参数.正常情况下会返回一个满足条件的对象.
当然除了传入主键作为参数以外,find还支持另外的高级查询: find(:first, :conditions => ....)这样会返回所有符合条件记录中的第一条.若使用find(:all, :conditions => ...)则会返回所有满足条件的记录.带这种参数的查找结果只有空(数组)或则对象(数组).
直接把外来数据填到SQL语句中,就等于把你的整个数据库在网上公开.
result = Order.find(:all, :conditions => params[:order])这是一种将表单数据作为查询条件的很好交互方法.
其中find方法的:order参数允许我们根据指定条件进行排序.:limit参数限制返回记录数.:select只取出需要的字段.
另外,我们还可以用find_by_sql方法,在其参数中使用我们自己的sql查询语句.
如果你调用模型类的find_by_开头的方法,ActiveRecord就会自动将其转成对查询方法的调用.如:find_by_name & find_by_name_and_password......
更新现有记录:
除了save方法外,update_attribute方法可以用来更新某几个特定i字段的值.
update方法将读取数据和更新数据的操作融合在一起.只需要传入一个更新的id,conditions,就能对特定的记录进行更新.
删除记录:
delete方法接受一个id作为参数,删除对应的记录.
destroy方法首先将当前模型对象对应的数据库记录删掉,然后冻结该对象的所有属性,不再允许对其进行修改.
模型对象中的关联
1:1关联.若A->B,则在A中加入B的主键作为外部键.并且A中声明以下关系:belongs_to :A,对应地B中声明如下:has_one :A;
1:N关联.同1:1关联,不同处在于.B中应该如此声明:has_many :A;
M:N关联.若两张表A,B中存入这样的关联,则需要额外建立第三张链接表A_B or B_A.这张表中不需要自动创建的id,只需要两个字段及A_id & B_id.同时在A,B中都应该有这样的声明:has_and_belongs_to_many :A/B.
:througt选项负责指出根据哪个关联进行对象间的导航.
检验方法
validates_acceptance_of:检查单选框(checkbox)是否被选中.
validates_associated:对关联对象进行检验
validates_confirmation_of:检查一个字段及其确认字段拥有相同的内容,比如再次确认输入密码.
validates_each:在代码块中检验一个或多个属性值.
validates_exclusion_of:检验属性值不在指定的一组值中.:in => enum [ options ]
validates_format_of:检验属性值是否匹配一个正则表达式.
validates_inclusion_of:检验指定属性值是否出现在一组指定的值之中.
validates_length_of:检验属性值的长度.:minimum, :maximum, :too_long, :too_short, :wrong_length.
validates_numericality_of:检验指定属性是合法的数值.
validates_presence_of:检验指定属性不为空.
validates_size_of:检验指定属性的长度.
validates_uniqueness_of:检验属性值的唯一性.