ruby入门学习笔记

一、语法速览

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:检验属性值的唯一性.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值