一、读书笔记
2.2 Ruby的一些基础知识
- 先举个Ruby函数的例子:
def say_goodnight(name)
result = "Good night, " + name
return result
end
puts say_goodnight('john')
puts say_goodnight('link')
result不用声明,被赋值的时候便存在了。
puts say_goodnight('john')
是含有两个方法,say_goodnight('john')这个方法的参数传给puts,puts是显示函数
还有另外一种写法是一样的道理:
puts(say_goodnight('john'))
- Ruby对单引号处理的少,对单引号字符串有更多的处理,首先,他寻找以反斜杠开始的序列,并用二进制替换他们,其中最常见的是\n,他会被回车符替换掉。举个例子:
puts "good night,\n grandama"
输出:
good night,
grandama
- Ruby对双引号字符串做的第二件事情是,表达式内插(expression interinterpolation),#{表达式}序列会被“表达式”的值替换,可以用这种方式重写前面的方法。
def say_goodnight(name)
result = "Good night, #{name}"
return result
end
puts say_goodnight('john')
puts say_goodnight('link')
- Ruby构建这个字符串对象时,它找到name的当前值并把它替换到字符串中,任意复杂的表达式都允许放在#{...}结构中,觉个例子:
def say_goodnight(name)
result = "Good night, #{name.capitalize}"
return result
end
puts say_goodnight('uncle')
结果:
good night,Uncle
- 如果表达式是一个全局实例或类变量,则不需要提供花括号。
$greet = "Hello" # $greet是全局变量
@name = "Produce" # @name是实例变量
puts "#$greet, #$name"
- 其实,可以进一步简化,把临时变量和return语句拿掉
def say_goodnight(name)
"Good night, #{name.capitalize}"
end
puts say_goodnight('uncle')
结果是一样的
- 总结:
全局变量用美元符号($),实例变量用(@),类变量用两个“at”(@@),最后,类常量、模块名和常量,都必须以一个大写字母开始。
2.3 数组和散列表
- Ruby的数组和散列表(hashes)是被索引的收集(indexed collection),两者都存储对象的集合,通过键(key)来访问。
- 数组键只能是整数,散列可以是任意对象。
2.4 控制结构
- Ruby具有所有常见的控制结构,如if语句和while循环语句
- 语句修饰符
if dog > 10
puts "danger, run away!"
end
可以改成这样:
puts "danger, run away!" if dog > 10
while循环语句也是如此
2.5 正则表达式
- 《精通正则表达式》
- 正则表达式是对象并且可以当做对象来操作
- 什么是模式(pattern),句个例子:
/perl|ython/
他会匹配perl或Python的字符串
前面那个斜线界定了模式,模式由要匹配的两个字符串组成,它们被管道符(|)分开,管道符的意思就是要么左边,要么右边。 - 可以在模式中使用括号:
/p(erl|ython)/
- 也可以在模式中指定重复(repettion),/ab+c/匹配了一个含有a,后面跟着一个或多个b,其后是c的字符串,把模式中的加号改成星号,/ab*c/创建了一个匹配含有a,零个或者多个b然后是c的表达式,
- 也可以在模式中一组或多组字符,一些常见的字符类(character classes),如\s,它匹配空白字符(空格符,制表符,回车换行符等等);\d,匹配任何数字;\w,匹配会出现在一个词内的任何字符。一个点(.)匹配几乎任意字符。
可以用它们产生一些有用的表达式:
/\d\d:\d\d:\d\d/ # 时间 12:34:12
/Perl.*Python/ # Perl,零个或多个别的字符,然后是Python
/Perl Python/ # Perl,一个空格和Python
/Perl *Python/ # Perl,零个或多个空格,和Python
/Perl +Python/ # Perl,一个或多个空格,和Python
/Perl\s+Python/ # Perl,空格字符,然后是Python
二、心得体会
今天的收获?一大堆rails函数
- super 表示调用父类的同名函数,并将本函数的所有参数传入父类的同名函数;
- split 把对象以某种格式分割成一个数组
- singularize 复数变成单数
- remove 以某种格式去掉对象中的元素或者转换对象中的元素位置
- try 这个整不明白??
- ActionController::Parameters 动作控制器参数
为了防止暴露不应暴露的属性,有要求(require)和许可(permit)两种方法,前者用
于根据需要标记参数,后者用于按照允许的方式设置参数,并限制允许批量更新的属性。
我对代码的理解:
class Admin::ApplicationController < ApplicationController # Admin::Application继承父类Application
before_action :top_module_for_namespace #在执行这个文件的下面这些代码之前,先执行这行代码,获取顶级module
before_action :sign_in_required #登陆
before_action :permission_required #权限验证
before_action :create_log #建立日志
def model
self.class.name.remove(/^Admin|Controller$/).singularize.safe_constantize #去掉类名中的Admin和controller,变成单数,返回
end
def top_module_for_namespace
self.class.name.split('::').second.safe_constantize #这个类本身的名称以'::'分割成一个数组,并且第取出二个值
end
def sign_in_required
return if current_user #如果用户已经登陆的话,则返回.....,否则提示无权限,并跳转到登陆页
respond_to do |format|
format.html { render template: 'admin/application/sign_in', layout: false }
format.json { render json: {}, status: :unauthorized }
end
end
def crud
@record ||= model.find(params[:id]) if params[:id] #如果@record没有值的话,就把后面的一大串赋值给它
@record ||= model.new # 新建一个记录
@record = model.new(ActionController::Parameters.new(@record.attributes).permit(*model.admin_fields)) if @record.try(:id) && params[:action] == 'new' && params[:id].present?
#动作控制器参数
@record.attributes = param.permit(*model.admin_fields) #attributes
@saved = @record.save if !request.get? && model.admin_fields.present?
respond_with_record
end
end
网友评论