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