1.不同的变量:
全局变量用美元符作为前缀 $;
而实例变量用 @ 开头;
类变量用 @@ 开头;
类名、模块名和常量应该用大写字母开头。
局部变量不可以在内部类和子类中访问。
2.区间范围:
1..5 表示1,2,3,4,5
1...5表示1,2,3,4
3.与JAVA相反的对象比较
== 比较对象的数值是否相等
eql? 比较对象的数值和类型是否相等
equal? 比较内存地址
4. NetBeans6 调整菜单栏字体大小
在NB6 快捷方式选目标加入 --fontsize 12
5.执行顺序
BEGIN 与 END 执行顺序相反, at_exit 比end 晚执行。
6. 按不同进制显示数字
"100".to_i(10); #按10进制显示。
"100".to_i(2); #按2进制显示。
7.类的get、set类型
attr_writer :duration 类似 set
attr_reader :duration 类似get
attr_reader :name, :gender, :age
attr_accessor :motherland 相当于attr_reader:motherland; attr_writer :motherland
att: 所定义的属性可读可写。
8. Ruby 脚本
ruby script/server :启动服务器
ruby script/server webrick :以webrick作为指定服务器
9.输出语句
puts会识别双引号""内的转义符,每打印一串信息,在结果后面自动换行。
print也会识别双引号""内的转义符,但每打印一串信息,不会在结果后面自动换行。
p则不会识别双引号""内的转义符,怎样的内容就怎样按原来的字符串输出,且在结果后自动换行。
10.取消方法
undef用来取消一个方法的定义,也可以使用Module#undef_method方法取消方法的定义。undef会取消方法名和方法定义之间的关系,即使超类中有同名方法,调用时也会引发异常。
而Module#remove_method方法只负责取消当前类中方法名和方法定义之间的关系,父类的同名方法仍可调用,这点差别非常重要。
11.返回参数
defined?用来判断表达式是否定义。若表达式尚未定义,则返回nil,若已经定义,则返回一个字符串描述该表达式的种类。
若yield调用可用,则返回真,具体返回值为字符串"yield"。它的作用同block_given?一样,可以判断能否以带块方式来调用某方法。
defined? super若super可被调用,则返回真, 具体返回值为字符串"super"。
12. %q 和 %Q
使用 %q 和 %Q 来生成字符串对象。%q 相当于单引号,%Q相当于双引号。
单引号原样输出,双引号参与运算。
puts %q/Spring quote/
puts %Q/Spring quote/
puts %q/ #{50*50} /
puts %Q/ #{50*50} /
Spring quote
Spring quote
#{50*50}
2500
?a 查看a的ascII数值
97.chr 查看a 的数值是好多
13.异常处理
begin … rescue … ensure …end
rescue ZeroDivisionError => ex
puts "Error, divide zero"
ensure
puts "Finish the process!"
ensure 无论如何都执行,有点像java的finally , 那么这个异常对象会被复制到ex中。
raise 抛出异常
throw :exception1 catch :exception1
14.时间格式化输出
Time.now.strftime(“%Y-%m-%d %H:%M:%S”);
15.变长参数
*num 方法后面加上这个符号,表示参数不定 。
def varadd(*num)
sum = 0
num.each { |i| sum+=i }
puts sum
end
varadd()
varadd(1,2,3)
varadd(1,2,3,4,5,6)
16. IO操作
模式 含义
R 只读,从文件头开始(默认模式)
R+ 读写,从文件头开始
W 只写,文件不存在则创建文件,文件存在则清空内容
W+ 读写,文件不存在则创建文件,文件存在则清空内容
A 只写,文件不存在则创建文件,文件存在则在尾部添加
A+ 读写,文件不存在则创建文件,文件存在则在尾部添加
B (只用于DOS/Windows)二进制文件,可以和上述模式一同出现
17.Hash、each的用法
h.each {|key, value| puts "#{key} is #{value}" }
countries = ["Korea", "Japan", "China", "Brazil"]
countries.each do |country|
puts "My country is " + country
end
puts "----Sort the array before iteration"
countries.sort.each do |country| #默认升序
puts "My country is " + country
end
puts "----Sort it in reverse order before iteration"
countries.sort.reverse.each do |country|
puts "My country is " + country
end
18. 将字符串变为常量
puts "Koala".intern.class
puts 'cat'.to_sym.class
puts "----Usage of strings consumes lots of memory because there are 10000 Q1 strings"
10000.times do |x|
x = { "Q1"=>"a", "Q2"=>"b", "Q3"=>"c", "Q4"=>"d"}
end
puts "----Usage of symbols consumes less memory because there is only one :Q1 symbol"
10000.times do |y|
y = { :Q1=>"a", :Q2=>"b", :Q3=>"c", :Q4=>"d"}
end
19. 不同变量的表示方法
puts “#{name1},#{@name2}”
20.文件读写
复制input.txt到output.txt,并显示output.txt文件。
infile = File.new("input.txt", "r")
outfile = File.new("output.txt", "w")
puts "----Read input.txt file and write it to output.txt file"
infile.each do
|i|
outfile.write i
end
outfile.close()
infile.close()
puts "----Display output.txt file"
outfile = File.new("output.txt", "r")
outfile.each do
|i|
puts i
end
21.Object查找有没有name方法
puts Object.respond_to?(:name)
22.instance_of? Kind_of?的区别
class A
end
class B < A
end
a = A.new
b = B.new
puts "----Exercise instance_of? and kind_of? methods among object instances"
puts a.instance_of?(A)
puts b.instance_of?(A) =>false
puts b.kind_of?(A) =>true
23. 定义缺省参数。
class MyOwnRubyMetaClass
def method_missing(m)
puts "#{m} method has "+m.to_s.length.to_s+" characters."
end
end
my_instance=MyOwnRubyMetaClass.new
my_instance.method1
my_instance.whatever
my_instance.m545
method1 method has 7 characters.
whatever method has 8 characters.
m545 method has 4 characters.
24. 两种each的显示:
puts "----First format of code block containing code fragment between { and }"
[1, 2, 3].each { |n| puts "Number #{n}" }
puts "----Second format of code block containing code fragment between do and end"
[1, 2, 3].each do |n|
puts "Number #{n}"
end
25.split
split(/(\s+)/): 匹配1个或多个空格字符
split(/\b/): 还可以匹配标点符号
26.每次处理字符串的一个字符
‘foobar’.each_byte {|x| puts “#{x} = #{x.chr}”}
102 = f
111 = o
。。。
‘foobar’.scan(/./){|c| puts c}
f
o
。。。
27. 组合键
“\C-a” Ctrl+ a 的序列
“\M-a” Alt + a 的序列
28. Array 总结
1) #数组赋值的bug,第一种它始终指向一个对象,所以只能用block的方式
f = Array.new(3, "blah")
f[0].capitalize!
puts f # f is now: ["Blah", "Blah", "Blah"]
g = Array.new(3) { "blah" }
g[0].capitalize!
puts g # f is now: ["Blah", "blah", "blah"]
2) 数组从0开始正排,负数从后面开始排。
3) 方法slice是[]方法的别名:
4) 方法nitems 也是返回数组的大小,不过他计算时不会包括nil的值:
y = [1, 2, nil, nil, 3, 4]
c = y.size # 6
d = y.length # 6
e = y.nitems # 4
5) 对象数组的比较,其中可以多个属性。
list = list.sort_by {|x| [x.name, x.age, x.height] }
6) 等价表达
# detect == find find_all==select reject 与select 相反
x = [5, 8, 12, 9, 4, 30]
#得到第一个偶数
p x.detect {|e| e % 2 == 0 } # 8
p x.find {|e| e % 2 == 0 } # 8
p x.find_all {|e| e % 2 == 0 } #[8, 12, 4, 30] p x.select{|e| e % 2 == 0 } #[8, 12, 4, 30] 7) grep()查找字符串
a = %w[January February March April May]
a.grep(/ary/) # ["January, "February"]
b = [1, 20, 5, 7, 13, 33, 15, 28]
b.grep(12..24) # [20, 13, 15]
8) 数组的集合操作
| 或 & 与 –差
# array加入异或操作,自定义函数 ,覆盖Array方法。
class Array
def ^(other)
(self | other) - (self & other)
end
end
x = [1, 2, 3, 4, 5]
y = [3, 4, 5, 6, 7]
z = x ^ y
p z # [1, 2, 6, 7]
include?或者member?
x = [1, 2, 3]
if x.include? 2
puts "yes" # Prints "yes"
else
puts "no"
end
#数组的交叉,并去除嵌套
a = [1, 2, 3, 4]
b = ["a", "b", "c", "d"]
c = a.zip(b)
p c
# c is now [[1,"a"], [2,"b"], [3,"c"], [4,"d"]]
# Use flatten if you want to eliminate the nesting
d = c.flatten
p d
# d is now [1, "a", 2, "b", 3, "c", 4, "d"]
9) collect map
我们能够使用collect,方法来操作数组,她也就是和一般函数式语言里面的map函数一样,将会返回一个新的数组,正好ruby中也有map方法,它是collect方法的别名:
x = %w[alpha bravo charlie delta echo foxtrot]
# Get the initial letters
a = x.collect {|w| w[0..0]} # 对每一个元素应用 [0..0] %w[a b c d e f]
# Get the string lengths
b = x.collect {|w| w.length} # [5, 5, 7, 5, 4, 7]
# map is just an alias
c = x.map {|w| w.length} # [5, 5, 7, 5, 4, 7]
10) 数组的删除
compact :去除数组nil对象
pop 数组删除最后一个元素
shift 数组删除最前一个元素
uniq 去除重复元素。
29. linux下安装ruby
1) 从http://www.ruby-lang.org/ 下载ruby-1.8.4.tar.gz
2) tar –zxf ruby-1.8.4.tar.gz
转入ruby文件目录下运行
$ ./configure
$ make
$ make install
3) ruby –v 查看当前版本
4) 设置环境变量
$echo $PATH
$export PATH=$PATH:/usr/local/ruby/bin 不能保存
全局环境变量/etc/profile
本地环境变量/home/username/.bash_profile
30. ruby 对象关系
31. self.last 和self.end 与..和…没有关系
(1..10).end #10
(1…10).end #10
32.ruby gem包放置位置
D:\ruby\lib\ruby\gems\1.8\cache
33. File
File.statr 结果包含关于文件元数据的宝贵信息。
mtime: 写文件的最后时间
atime: 读文件的最后时间
‘w’: 写模式
‘a’ : 附加模式
要查找当前工作目录:
Dir.getwd
Rails读书笔记
1. 编码设置
UTF-8
1) netbeans 安装目录的etc目录下面修改
netbeans_default_options="-J-Dorg.netbeans.modules.tomcat.autoregister.token=1213058320593 -J-Dorg.netbeans.modules.tomcat.autoregister.catalinaHome=\"D:\Apache Tomcat 6.0.16\" -J-Dcom.sun.aas.installRoot=\"C:\Program Files\glassfish-v2ur2\" -J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true -J-Dfile.encoding=UTF-8"
2) netbeans工程项目选择UTF-8
3) environment.rb加入
ENV['NLS_LANG'] = "AMERICAN_AMERICA.UTF8"
4) application.rb加入
ActionController::Base.default_charset=("UTF-8")
before_filter :configure_charsets
def configure_charsets
response.headers["Content-Type"] = "text/html; charset=UTF-8"
end
5)所有rhtml页面的编码改为UTF-8,文件格式都要改成UTF-8,.rb的文件可以不改。
UTF-8情况下,控制台中国标准时间是乱码,而且处理传递中文参数乱码。
GBK
1) netbeans工程项目选择GBK
2) application.rb加入
$KCODE="GBK"
ActionController::Base.default_charset=("GBK")
before_filter :configure_charsets
def configure_charsets
response.headers["Content-Type"] = "text/html; charset=GBK"
end
3) 所有ruby、rhtml文件格式不变,统一为标准编码。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<meta http-equiv="content-type" content="text/html;charset=GBK" />
控制台中文参数正确,页面传递中文参数也没有问题。
2. rails depot 项目总结
1) 缺省admin 的密码secret
2) 数据库迁移语法。
add_column :products, :price, :decimal, :precision => 8, :scale => 2, :default => 0
:precision 有效数字
:scale 小数点后位数
3) 校验
validates_presence_of :title, :description, :image_url #校验是否为空
validates_numericality_of :price #检验数字是否非法
validates_uniqueness_of :title #检验标题是否唯一
validates_format_of :image_url,
:with => %r{\.(gif|jpg|png)$}i,
:message => "must be a URL for a GIF, JPG, or PNG image"
protected
def validate
errors.add(:price, "should be at least 0.01") if price.nil? || price < 0.01
end
4) %{} 连接比较长的字符串
5) 标签库
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6) CSS的套用
<%= stylesheet_link_tag "scaffold", "depot", :media => "all" %>
Js的应用
<%= javascript_include_tag 'allocationinfograph' %>
<%= javascript_include_tag :defaults%>
7) 交替使用颜色
<%= cycle('list-line-odd', 'list-line-even') %>
8)价钱显示方式,默认显示2位
<%= number_to_currency(product.price) %>
Number_to_currency(123456789.50,:unit=>”£”,:separator=>”,”,:delimiter=>””)
£123456789,50
¥
9)激活session机制
config.action_controller.session_store = :active_record_store
10) 模型之间的关系
比如订单(order)和(line_items)是主从表关系
class Order < ActiveRecord::Base
has_many :line_items
end
class LineItem < ActiveRecord::Base
belongs_to rder
belongs_to :product
end
11)命名约定
变量名应该全部小写,单词之间以下划线分隔。
类和模块的名称下面没有下划线,首字母大写。
12) 2.1下脚手架的使用
ruby script/generate scaffold product title:string description:text image_url:string
13)防注入SQL语句
name = params[:name]
pos = Order.find(:all,:conditions=>[“name=? and pay_type=’po’”,name]);
使用like
name = params[:name]
User.find(:all,:conditions=>[“name like ?”, name+”%”]);
:conditions 条件 :conditions=>[”name=?”,name]
:order 排序 rder=>”pay_type,ship desc”
:limit 条数 :limit=>10
:offset 偏移数量 :limit=>page_size,:offset=>page_num*page_size
:joins 表之间的关联 :joins=>”inner join products on …”
:select 字段 :select=>”title,speaker,recorded_on”
:readonly :readonly=>true
:from :from=>表名
:group :group=>”sku”
14) delete 和destory 的区别
Delete 绕过了ActionRecord的回调和验证
Destroy 确保调用这些功能。
最好使用后者。
15) 字符串连接方式
name1="中国"
name2="日本"
name3="韩国"
puts [name1,name2,name3].compact.join("")
puts name1+name2+name3
中国日本韩国 中国日本韩国 16) 用聚合来组织数据
Composed_of :name,
:class_name =>Name,
:mapping=>
[
[:first_name :first],
[:initizls, :initizls],
[:last_name, :last]
]
17) 当数据库出现写操作时,切记语句要有ID。
18) 一对一、一对多、多对多的分别写法
一对一:
class Order < ActiveRecord::Base
has_one :invoice
End
Class Invoice < ActiveRecord::Base
belongs_to rder
End
一对多:
class Order < ActiveRecord::Base
has_many :line_items
End
Class LineItem < ActiveRecord::Base
Belongs_to rder
End
多对多:
class Product < ActiveRecord::Base
has_and_belongs_to_many :categories
End
Class Cateory <ActiveRecord::Base
has_and_belongs_to_many :products
End
19)校验
validates_acceptance_of 检查checkbox是否被选中。
validates_associated 对关联对象进行校验。
validates_confirmation_of 校验一个字段及确认字段拥有相同的内容。
validates_each 在代码块中校验1个或多个属性值。
validates_exclusion_of 校验属性值不在一组值之中。
validates_format_of 校验属性值是否匹配1个正则表达式
validates_inclusion_of 校验指定的属性值是否出现在一组指定的数值中。
validates_length_of 校验属性值的长度。
validates_numericality_of 校验指定属性是合法的数值。
validates_presence_of 校验指定属性不为空。
validates_size_of 校验指定属性的长度
validates_uniqueness_of 校验属性的唯一性。
20)save 成功返回true,失败返回nil。
save! 成功返回true,失败抛出异常。
begin
Order.save!
rescue RecordInvalid =>error
# 处理
end
21)开发环境部署
1.安装rails2.1
2.安装数据库dbi
1)gem install activerecord-oracle-adapter --source http://gems.rubyonrails.org
2)然后再安装ruby和oracle的驱动:
gem install ruby-oci8 或者 ruby ruby-oci8-1.0.0-mswin32.rb
还需要把database.yml里面的adapter名字从oci改为oralce
22)rails扩展string操作
string =”Now is the time”
puts string.at(2)
puts string.from(8)
puts string.to(8)
puts string.first
puts string.first(3)
puts string.last
puts string.last(4)
puts string.starts_with?(“No”)
puts string.ends_with(“ME”)
puts Time.now.to_s(:db) 2008-05-12 09:30:00
23)对象数组的比较排序
list4.sort!{ |a,b| a.freq_start <=> b.freq_start }
24)配套JS收集
//合并单元格
function SpanGrid(tabObj,colIndex)
{
if(tabObj != null)
{
var i,j;
var intSpan;
var strTemp;
for(i = 0; i < tabObj.rows.length; i++)
{
intSpan = 1;
strTemp = tabObj.rows[i].cells[colIndex].innerText;
for(j = i + 1; j < tabObj.rows.length; j++)
{
if(strTemp == tabObj.rows[j].cells[colIndex].innerText)
{
intSpan++;
tabObj.rows[i].cells[colIndex].rowSpan = intSpan;
tabObj.rows[j].cells[colIndex].style.display = "none";
}
else
{
break;
}
}
i = j - 1;
}
}
}
其中tabObj为table的id,colIndex是对与那一列。
25)js 传中文参数
1.页面传取用encodeURIComponent(中文)
2.页面读取用
require "iconv"
system_name= Iconv.conv("gbk", "utf-8", system_name) 进行转码
26) rails注释的写法
# todo: 这里增加代码
# optimize: 此函数需要优化
# fixme: 需要修正
找出注释清单
rake notes
rake notes:todo
27)ActiveRecord::Base.pluralize_table_names = false #单数表名支持
全局变量用美元符作为前缀 $;
而实例变量用 @ 开头;
类变量用 @@ 开头;
类名、模块名和常量应该用大写字母开头。
局部变量不可以在内部类和子类中访问。
2.区间范围:
1..5 表示1,2,3,4,5
1...5表示1,2,3,4
3.与JAVA相反的对象比较
== 比较对象的数值是否相等
eql? 比较对象的数值和类型是否相等
equal? 比较内存地址
4. NetBeans6 调整菜单栏字体大小
在NB6 快捷方式选目标加入 --fontsize 12
5.执行顺序
BEGIN 与 END 执行顺序相反, at_exit 比end 晚执行。
6. 按不同进制显示数字
"100".to_i(10); #按10进制显示。
"100".to_i(2); #按2进制显示。
7.类的get、set类型
attr_writer :duration 类似 set
attr_reader :duration 类似get
attr_reader :name, :gender, :age
attr_accessor :motherland 相当于attr_reader:motherland; attr_writer :motherland
att: 所定义的属性可读可写。
8. Ruby 脚本
ruby script/server :启动服务器
ruby script/server webrick :以webrick作为指定服务器
9.输出语句
puts会识别双引号""内的转义符,每打印一串信息,在结果后面自动换行。
print也会识别双引号""内的转义符,但每打印一串信息,不会在结果后面自动换行。
p则不会识别双引号""内的转义符,怎样的内容就怎样按原来的字符串输出,且在结果后自动换行。
10.取消方法
undef用来取消一个方法的定义,也可以使用Module#undef_method方法取消方法的定义。undef会取消方法名和方法定义之间的关系,即使超类中有同名方法,调用时也会引发异常。
而Module#remove_method方法只负责取消当前类中方法名和方法定义之间的关系,父类的同名方法仍可调用,这点差别非常重要。
11.返回参数
defined?用来判断表达式是否定义。若表达式尚未定义,则返回nil,若已经定义,则返回一个字符串描述该表达式的种类。
若yield调用可用,则返回真,具体返回值为字符串"yield"。它的作用同block_given?一样,可以判断能否以带块方式来调用某方法。
defined? super若super可被调用,则返回真, 具体返回值为字符串"super"。
12. %q 和 %Q
使用 %q 和 %Q 来生成字符串对象。%q 相当于单引号,%Q相当于双引号。
单引号原样输出,双引号参与运算。
puts %q/Spring quote/
puts %Q/Spring quote/
puts %q/ #{50*50} /
puts %Q/ #{50*50} /
Spring quote
Spring quote
#{50*50}
2500
?a 查看a的ascII数值
97.chr 查看a 的数值是好多
13.异常处理
begin … rescue … ensure …end
rescue ZeroDivisionError => ex
puts "Error, divide zero"
ensure
puts "Finish the process!"
ensure 无论如何都执行,有点像java的finally , 那么这个异常对象会被复制到ex中。
raise 抛出异常
throw :exception1 catch :exception1
14.时间格式化输出
Time.now.strftime(“%Y-%m-%d %H:%M:%S”);
15.变长参数
*num 方法后面加上这个符号,表示参数不定 。
def varadd(*num)
sum = 0
num.each { |i| sum+=i }
puts sum
end
varadd()
varadd(1,2,3)
varadd(1,2,3,4,5,6)
16. IO操作
模式 含义
R 只读,从文件头开始(默认模式)
R+ 读写,从文件头开始
W 只写,文件不存在则创建文件,文件存在则清空内容
W+ 读写,文件不存在则创建文件,文件存在则清空内容
A 只写,文件不存在则创建文件,文件存在则在尾部添加
A+ 读写,文件不存在则创建文件,文件存在则在尾部添加
B (只用于DOS/Windows)二进制文件,可以和上述模式一同出现
17.Hash、each的用法
h.each {|key, value| puts "#{key} is #{value}" }
countries = ["Korea", "Japan", "China", "Brazil"]
countries.each do |country|
puts "My country is " + country
end
puts "----Sort the array before iteration"
countries.sort.each do |country| #默认升序
puts "My country is " + country
end
puts "----Sort it in reverse order before iteration"
countries.sort.reverse.each do |country|
puts "My country is " + country
end
18. 将字符串变为常量
puts "Koala".intern.class
puts 'cat'.to_sym.class
puts "----Usage of strings consumes lots of memory because there are 10000 Q1 strings"
10000.times do |x|
x = { "Q1"=>"a", "Q2"=>"b", "Q3"=>"c", "Q4"=>"d"}
end
puts "----Usage of symbols consumes less memory because there is only one :Q1 symbol"
10000.times do |y|
y = { :Q1=>"a", :Q2=>"b", :Q3=>"c", :Q4=>"d"}
end
19. 不同变量的表示方法
puts “#{name1},#{@name2}”
20.文件读写
复制input.txt到output.txt,并显示output.txt文件。
infile = File.new("input.txt", "r")
outfile = File.new("output.txt", "w")
puts "----Read input.txt file and write it to output.txt file"
infile.each do
|i|
outfile.write i
end
outfile.close()
infile.close()
puts "----Display output.txt file"
outfile = File.new("output.txt", "r")
outfile.each do
|i|
puts i
end
21.Object查找有没有name方法
puts Object.respond_to?(:name)
22.instance_of? Kind_of?的区别
class A
end
class B < A
end
a = A.new
b = B.new
puts "----Exercise instance_of? and kind_of? methods among object instances"
puts a.instance_of?(A)
puts b.instance_of?(A) =>false
puts b.kind_of?(A) =>true
23. 定义缺省参数。
class MyOwnRubyMetaClass
def method_missing(m)
puts "#{m} method has "+m.to_s.length.to_s+" characters."
end
end
my_instance=MyOwnRubyMetaClass.new
my_instance.method1
my_instance.whatever
my_instance.m545
method1 method has 7 characters.
whatever method has 8 characters.
m545 method has 4 characters.
24. 两种each的显示:
puts "----First format of code block containing code fragment between { and }"
[1, 2, 3].each { |n| puts "Number #{n}" }
puts "----Second format of code block containing code fragment between do and end"
[1, 2, 3].each do |n|
puts "Number #{n}"
end
25.split
split(/(\s+)/): 匹配1个或多个空格字符
split(/\b/): 还可以匹配标点符号
26.每次处理字符串的一个字符
‘foobar’.each_byte {|x| puts “#{x} = #{x.chr}”}
102 = f
111 = o
。。。
‘foobar’.scan(/./){|c| puts c}
f
o
。。。
27. 组合键
“\C-a” Ctrl+ a 的序列
“\M-a” Alt + a 的序列
28. Array 总结
1) #数组赋值的bug,第一种它始终指向一个对象,所以只能用block的方式
f = Array.new(3, "blah")
f[0].capitalize!
puts f # f is now: ["Blah", "Blah", "Blah"]
g = Array.new(3) { "blah" }
g[0].capitalize!
puts g # f is now: ["Blah", "blah", "blah"]
2) 数组从0开始正排,负数从后面开始排。
3) 方法slice是[]方法的别名:
4) 方法nitems 也是返回数组的大小,不过他计算时不会包括nil的值:
y = [1, 2, nil, nil, 3, 4]
c = y.size # 6
d = y.length # 6
e = y.nitems # 4
5) 对象数组的比较,其中可以多个属性。
list = list.sort_by {|x| [x.name, x.age, x.height] }
6) 等价表达
# detect == find find_all==select reject 与select 相反
x = [5, 8, 12, 9, 4, 30]
#得到第一个偶数
p x.detect {|e| e % 2 == 0 } # 8
p x.find {|e| e % 2 == 0 } # 8
p x.find_all {|e| e % 2 == 0 } #[8, 12, 4, 30] p x.select{|e| e % 2 == 0 } #[8, 12, 4, 30] 7) grep()查找字符串
a = %w[January February March April May]
a.grep(/ary/) # ["January, "February"]
b = [1, 20, 5, 7, 13, 33, 15, 28]
b.grep(12..24) # [20, 13, 15]
8) 数组的集合操作
| 或 & 与 –差
# array加入异或操作,自定义函数 ,覆盖Array方法。
class Array
def ^(other)
(self | other) - (self & other)
end
end
x = [1, 2, 3, 4, 5]
y = [3, 4, 5, 6, 7]
z = x ^ y
p z # [1, 2, 6, 7]
include?或者member?
x = [1, 2, 3]
if x.include? 2
puts "yes" # Prints "yes"
else
puts "no"
end
#数组的交叉,并去除嵌套
a = [1, 2, 3, 4]
b = ["a", "b", "c", "d"]
c = a.zip(b)
p c
# c is now [[1,"a"], [2,"b"], [3,"c"], [4,"d"]]
# Use flatten if you want to eliminate the nesting
d = c.flatten
p d
# d is now [1, "a", 2, "b", 3, "c", 4, "d"]
9) collect map
我们能够使用collect,方法来操作数组,她也就是和一般函数式语言里面的map函数一样,将会返回一个新的数组,正好ruby中也有map方法,它是collect方法的别名:
x = %w[alpha bravo charlie delta echo foxtrot]
# Get the initial letters
a = x.collect {|w| w[0..0]} # 对每一个元素应用 [0..0] %w[a b c d e f]
# Get the string lengths
b = x.collect {|w| w.length} # [5, 5, 7, 5, 4, 7]
# map is just an alias
c = x.map {|w| w.length} # [5, 5, 7, 5, 4, 7]
10) 数组的删除
compact :去除数组nil对象
pop 数组删除最后一个元素
shift 数组删除最前一个元素
uniq 去除重复元素。
29. linux下安装ruby
1) 从http://www.ruby-lang.org/ 下载ruby-1.8.4.tar.gz
2) tar –zxf ruby-1.8.4.tar.gz
转入ruby文件目录下运行
$ ./configure
$ make
$ make install
3) ruby –v 查看当前版本
4) 设置环境变量
$echo $PATH
$export PATH=$PATH:/usr/local/ruby/bin 不能保存
全局环境变量/etc/profile
本地环境变量/home/username/.bash_profile
30. ruby 对象关系
31. self.last 和self.end 与..和…没有关系
(1..10).end #10
(1…10).end #10
32.ruby gem包放置位置
D:\ruby\lib\ruby\gems\1.8\cache
33. File
File.statr 结果包含关于文件元数据的宝贵信息。
mtime: 写文件的最后时间
atime: 读文件的最后时间
‘w’: 写模式
‘a’ : 附加模式
要查找当前工作目录:
Dir.getwd
Rails读书笔记
1. 编码设置
UTF-8
1) netbeans 安装目录的etc目录下面修改
netbeans_default_options="-J-Dorg.netbeans.modules.tomcat.autoregister.token=1213058320593 -J-Dorg.netbeans.modules.tomcat.autoregister.catalinaHome=\"D:\Apache Tomcat 6.0.16\" -J-Dcom.sun.aas.installRoot=\"C:\Program Files\glassfish-v2ur2\" -J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Dsun.java2d.noddraw=true -J-Dfile.encoding=UTF-8"
2) netbeans工程项目选择UTF-8
3) environment.rb加入
ENV['NLS_LANG'] = "AMERICAN_AMERICA.UTF8"
4) application.rb加入
ActionController::Base.default_charset=("UTF-8")
before_filter :configure_charsets
def configure_charsets
response.headers["Content-Type"] = "text/html; charset=UTF-8"
end
5)所有rhtml页面的编码改为UTF-8,文件格式都要改成UTF-8,.rb的文件可以不改。
UTF-8情况下,控制台中国标准时间是乱码,而且处理传递中文参数乱码。
GBK
1) netbeans工程项目选择GBK
2) application.rb加入
$KCODE="GBK"
ActionController::Base.default_charset=("GBK")
before_filter :configure_charsets
def configure_charsets
response.headers["Content-Type"] = "text/html; charset=GBK"
end
3) 所有ruby、rhtml文件格式不变,统一为标准编码。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<meta http-equiv="content-type" content="text/html;charset=GBK" />
控制台中文参数正确,页面传递中文参数也没有问题。
2. rails depot 项目总结
1) 缺省admin 的密码secret
2) 数据库迁移语法。
add_column :products, :price, :decimal, :precision => 8, :scale => 2, :default => 0
:precision 有效数字
:scale 小数点后位数
3) 校验
validates_presence_of :title, :description, :image_url #校验是否为空
validates_numericality_of :price #检验数字是否非法
validates_uniqueness_of :title #检验标题是否唯一
validates_format_of :image_url,
:with => %r{\.(gif|jpg|png)$}i,
:message => "must be a URL for a GIF, JPG, or PNG image"
protected
def validate
errors.add(:price, "should be at least 0.01") if price.nil? || price < 0.01
end
4) %{} 连接比较长的字符串
5) 标签库
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6) CSS的套用
<%= stylesheet_link_tag "scaffold", "depot", :media => "all" %>
Js的应用
<%= javascript_include_tag 'allocationinfograph' %>
<%= javascript_include_tag :defaults%>
7) 交替使用颜色
<%= cycle('list-line-odd', 'list-line-even') %>
8)价钱显示方式,默认显示2位
<%= number_to_currency(product.price) %>
Number_to_currency(123456789.50,:unit=>”£”,:separator=>”,”,:delimiter=>””)
£123456789,50
¥
9)激活session机制
config.action_controller.session_store = :active_record_store
10) 模型之间的关系
比如订单(order)和(line_items)是主从表关系
class Order < ActiveRecord::Base
has_many :line_items
end
class LineItem < ActiveRecord::Base
belongs_to rder
belongs_to :product
end
11)命名约定
变量名应该全部小写,单词之间以下划线分隔。
类和模块的名称下面没有下划线,首字母大写。
12) 2.1下脚手架的使用
ruby script/generate scaffold product title:string description:text image_url:string
13)防注入SQL语句
name = params[:name]
pos = Order.find(:all,:conditions=>[“name=? and pay_type=’po’”,name]);
使用like
name = params[:name]
User.find(:all,:conditions=>[“name like ?”, name+”%”]);
:conditions 条件 :conditions=>[”name=?”,name]
:order 排序 rder=>”pay_type,ship desc”
:limit 条数 :limit=>10
:offset 偏移数量 :limit=>page_size,:offset=>page_num*page_size
:joins 表之间的关联 :joins=>”inner join products on …”
:select 字段 :select=>”title,speaker,recorded_on”
:readonly :readonly=>true
:from :from=>表名
:group :group=>”sku”
14) delete 和destory 的区别
Delete 绕过了ActionRecord的回调和验证
Destroy 确保调用这些功能。
最好使用后者。
15) 字符串连接方式
name1="中国"
name2="日本"
name3="韩国"
puts [name1,name2,name3].compact.join("")
puts name1+name2+name3
中国日本韩国 中国日本韩国 16) 用聚合来组织数据
Composed_of :name,
:class_name =>Name,
:mapping=>
[
[:first_name :first],
[:initizls, :initizls],
[:last_name, :last]
]
17) 当数据库出现写操作时,切记语句要有ID。
18) 一对一、一对多、多对多的分别写法
一对一:
class Order < ActiveRecord::Base
has_one :invoice
End
Class Invoice < ActiveRecord::Base
belongs_to rder
End
一对多:
class Order < ActiveRecord::Base
has_many :line_items
End
Class LineItem < ActiveRecord::Base
Belongs_to rder
End
多对多:
class Product < ActiveRecord::Base
has_and_belongs_to_many :categories
End
Class Cateory <ActiveRecord::Base
has_and_belongs_to_many :products
End
19)校验
validates_acceptance_of 检查checkbox是否被选中。
validates_associated 对关联对象进行校验。
validates_confirmation_of 校验一个字段及确认字段拥有相同的内容。
validates_each 在代码块中校验1个或多个属性值。
validates_exclusion_of 校验属性值不在一组值之中。
validates_format_of 校验属性值是否匹配1个正则表达式
validates_inclusion_of 校验指定的属性值是否出现在一组指定的数值中。
validates_length_of 校验属性值的长度。
validates_numericality_of 校验指定属性是合法的数值。
validates_presence_of 校验指定属性不为空。
validates_size_of 校验指定属性的长度
validates_uniqueness_of 校验属性的唯一性。
20)save 成功返回true,失败返回nil。
save! 成功返回true,失败抛出异常。
begin
Order.save!
rescue RecordInvalid =>error
# 处理
end
21)开发环境部署
1.安装rails2.1
2.安装数据库dbi
1)gem install activerecord-oracle-adapter --source http://gems.rubyonrails.org
2)然后再安装ruby和oracle的驱动:
gem install ruby-oci8 或者 ruby ruby-oci8-1.0.0-mswin32.rb
还需要把database.yml里面的adapter名字从oci改为oralce
22)rails扩展string操作
string =”Now is the time”
puts string.at(2)
puts string.from(8)
puts string.to(8)
puts string.first
puts string.first(3)
puts string.last
puts string.last(4)
puts string.starts_with?(“No”)
puts string.ends_with(“ME”)
puts Time.now.to_s(:db) 2008-05-12 09:30:00
23)对象数组的比较排序
list4.sort!{ |a,b| a.freq_start <=> b.freq_start }
24)配套JS收集
//合并单元格
function SpanGrid(tabObj,colIndex)
{
if(tabObj != null)
{
var i,j;
var intSpan;
var strTemp;
for(i = 0; i < tabObj.rows.length; i++)
{
intSpan = 1;
strTemp = tabObj.rows[i].cells[colIndex].innerText;
for(j = i + 1; j < tabObj.rows.length; j++)
{
if(strTemp == tabObj.rows[j].cells[colIndex].innerText)
{
intSpan++;
tabObj.rows[i].cells[colIndex].rowSpan = intSpan;
tabObj.rows[j].cells[colIndex].style.display = "none";
}
else
{
break;
}
}
i = j - 1;
}
}
}
其中tabObj为table的id,colIndex是对与那一列。
25)js 传中文参数
1.页面传取用encodeURIComponent(中文)
2.页面读取用
require "iconv"
system_name= Iconv.conv("gbk", "utf-8", system_name) 进行转码
26) rails注释的写法
# todo: 这里增加代码
# optimize: 此函数需要优化
# fixme: 需要修正
找出注释清单
rake notes
rake notes:todo
27)ActiveRecord::Base.pluralize_table_names = false #单数表名支持