美文网首页
Day2 读书笔记&心得体会

Day2 读书笔记&心得体会

作者: 柳辉 | 来源:发表于2017-06-01 11:26 被阅读11次

一、读书笔记
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

相关文章

网友评论

      本文标题:Day2 读书笔记&心得体会

      本文链接:https://www.haomeiwen.com/subject/mcisfxtx.html