美文网首页
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