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

Day23 心得体会&读书笔记

作者: 柳辉 | 来源:发表于2017-05-26 21:53 被阅读17次

    一、心得体会
    1、今天我完成了什么?

    • 今天完成了Rails guides 5的视图、控制器,大致看了route、扩展、安全等部分
    • 手打一遍application.rb

    2、今天我收获了什么?

    • 乐观锁、悲观锁
    • <% %>建立循环,使用<%= %>插入名称
    • :params 占内存
    • I18n

    3、今天犯了哪些错误?

    • 快速的翻了一遍Rails guides 5的中文版和英文版,但是事后总结的时候,记不起什么东西了

    4、今天的状态如何?

    • 今天状态不错,制定了一天的学习计划,最后快下班的时候迅速把application.rb给写完了

    5、明天还要做哪些工作?

    • 明天准备考试
    • 看代码

    二、自问自答:

    为什么不能用缩进?
    编辑器自动转换
    为什么要用冒号?
    更省内存

    三、读书笔记

    第三部分 视图

    模糊不清的:

    • <% %>建立循环,使用<%= %>插入名称
    • :params的:到底是什么意思呢?
    • 加载所有核心扩展
    require 'active_support'
    require 'active_support/core_ext'
    
    • 所有对象皆可使用的扩展

    • blank?和present?

      • nil和false
      • 只有空白的字符串
      • 空数组和空散列
      • 其他能响应empty?方法,而且返回值为true的对象

    14.2.5 try

    如果只想当对象不为nil时在其调用方法上,最简单的方式是使用条件语句,但这么做把代码变复杂了,你可以使用try方法。

    try方法和Object#send方法类似,但如果在nil上调用,返回值为nil。

    举个例子:

    unless @number.nil
      @number.next
    end
    

    简单的写法:

    @number.try(:next)
    

    下面的例子摘自ActiveRecord::ConnectionAdapters::AbstractAdapter,实例变量@logger有可能为nil,可以看出,使用try方法可以避免不必要的检查。

    def log_info(sql, name, ms)
      if @logger.try(:debug?)
        name = '%s (%.1fms)' %[name || 'SQL', ms]
        @logger.debug(format_log_entry(name, sql.squeeze(' ')))
      end
    end
    

    try方法也可接受代码块,仅当对象不为nil时才会执行其中的代码:

    @person.try {|p| "#{p.first_name} #{p.last_name}"}
    

    注意,try会吞没没有方法错误,返回nil,如果想避免此类问题,应该使用try!:

    @number.try(:nest) # => nil
    @number.try!(:nest)
    

    14.3 Module的扩展

    14.3.1 alias_method_chain

    14.3.2 属性

    14.3.2.1 alias_attribute

    模型的属性有读值方法、设值方法和判断方法。alias_attribute方法可以一次性为这三种方法创建别名。和其他创建别名的方法一样,alias_attribute方法的第一个参数是新属性名,第二个参数是旧属性名(我是这样的记的,参数的顺序和赋值语句一样):

    class User < application
      alias_attribute :login, :email
    end
    

    14.3.2.2 内部属性

    如果在父类中定义属性,有可能出现命名冲突,代码库一定要注意这个问题。

    Active Support提供了attr_internal_reader、attr_internal_writer和attr_internal_accessor三个方法,其行为与Ruby内置的attr_*方法类似,但使用其他方式命名实例变量,从而减少重名的几率。

    attr_internal方法是attr_internal_accessor方法的别名:

    在上面的例子中,:log_level可能不属于代码库的公开接口,只在开发过程中使用,开发者并不知道潜在的重名风险,创建了子类,并在子类中定义了:log_level,幸好用了attr_internal方法才不会出现命名冲突。

    14.3.2.3 模块属性

    方法mattr_reader、mattr_writer和mattr_accessor类似于定义的cattr_方法,其实cattr_方法就是mattr_*方法的别名

    14.3.3 父级

    14.3.3.1 parent
    在嵌套的具名模块上调用parent方法,返回包含对应常量的模块:

    module X
      module Y
        module Z
        end
      end
    end
    
    M = X::Y::Z
    X::Y::Z.parent
    m.parent
    

    如果匿名模块或位于顶层,parent方法返回Object。

    14.4.1 类属性

    14.4.1.1 class_attribute

    class_attribute方法声明一个或多个可继承的类属性,它们可以在继承树的任一层级覆盖。

    class A
      class_attribute :x
    end
    
    class B < A; end
    
    
    class C < B; end
    
    A.x = :a
    

    把:instance_writer选项设为false,不生成设置实例方法:

    15.1 Rails中l18n的工作原理

    • 支持英语及类似语言
    • 易于定制和扩展,以支持其他语言

    作为这个解决方案的一部分,Rails框架中的每个静态字符串(例如,Active Record数据验证信息、时间和日期格式化)都已国际化,Rais应用的本地化意味着把这些静态字符串翻译为所需语言。

    15.1.1 l18n库的总体架构

    因此,Ruby I18n gem分为两部分:

    • I18n框架的公开API——包含公开方法的Ruby模块,定义I18n库的工作方式
    • 实现这些方法的默认后端

    15.1.2 I18n公开API
    I18n API中最重要的两个方法是:

    translate # 查找文本翻译
    localize # 把日期和时间对象转换为本地格式

    这两个方法的别名分别为#t和#l,用法如下:

    I18n.t 'store.title'
    l18n.l Time.now
    

    对于以下属性,I18n API还提供了属性读值方法和设值方法:

    load_path # 自定义翻译文件的路径
    locale # 获取或设置当前区域
    default_local # 获取或设置默认区域
    Exception_handler # 使用其他异常处理程序
    backen # 使用其他后端

    第 17章 Active Job基础

    Active Job框架负责声明作业,在各种队列后端中运行,作业各种各样,可以是定期清理、账单支付和寄信。其实,任何可以分解且并行运行的工作都可以。

    17.2 Active Job的作用

    主要作用是确保所有Rails应用都有作业基础设施,这样便可以在此基础上构建各种功能和其他gem,而无需担心不同作业运行程序(Delayed Job和Resque)的API之间的差异。此外,选用哪个队列后端只是战术问题。而且,切换队列后端也不用重写作业。

    17.3 创建作业

    Active Job提供了一个Rails生成器,用于作业。

    Rails遵守这样的风格:

    • (缩进)使用两个空格,不用制表符。
    • 行尾没有空白。空行不能有任何空白。
    • 私有和受保护的方法多一层缩进。
    • 使用 Ruby 1.9 及以上版本采用的散列句法。使用 { a: :b },而非 { :a => :b }。
    • 较之and/or,尽量使用&&/||。
    • 编写类方法时,较之 self.method,尽量使用 class << self。
    • 使用 my_method(my_arg),而非 my_method( my_arg ) 或 my_method my_arg。
    • 使用 a = b,而非 a=b。
    • 使用assert_not方法,而非refute。
    • 编写单行块时,较之 method{do_stuff},尽量使用 method { do_stuff }。
    • 遵照源码中在用的其他约定。

    英文版的Rails guides 5

    Active Record callback

    class User < ApplicationRecord
      validates :login, :email, presence: true
     
      before_validation :ensure_login_has_a_value
     
      private
        def ensure_login_has_a_value
          if login.nil?
            self.login = email unless email.blank?
          end
        end
    end
    

    如果换成单行,长这样:

    class User < ApplicationRecord
      validates :login, :email, presence: true
     
      before_create do
        self.name = login.capitalize if name.blank?
      end
    end
    

    什么是I18n?

    internationalization i与n之间有18个字母

    相关文章

      网友评论

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

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