一、心得体会
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个字母