继续查漏补缺
昨天读 Ruby on Rails 教程,查漏补缺一些知识点,伴随一些自己的理解。
- Rails 是用 Ruby 写的一种 DSL,即 Domain Specific Language。因为 Ruby 具有非常大的灵活性,类和方法都可以重写。Rails 可以理解成在 Ruby 原生基础上,针对 Web 开发这个领域,重写了很多类和方法,也增加了很多类和方法。另一个角度上,Rails 是在 Ruby 的基础上添加了很多约束,使得其在更加适合 Web 开发这个领域。
- 在 Ruby 中双引号可以实现单引号的所有功能,反之,单引号却不能替代双引号(只有双引号才可以引用变量)。那单引号的存在意义是什么呢?单引号的特点是,将引号内部的所有字符的「字面值」转成字符串。也就是说,单引号对任何字符都不敏感,一律看做字符串。这在某些情况下,用双引号可能需要增加很多转义符号
/
,但用单引号就可以非常清爽。 - Symbol 可以看做是没有约束的 String。除了
objec_id
上的唯一,Symbol 是可以看做一个整体,而 String 在某种意义上来看,可以看做是一个或多个单字符组成的数列。比如说两个 String 做比较的时候,内在的运行原理是要从头到尾,一个字符一个字符地去比较。而 Symbol 只比较一次就可以了,效率上高很多。 - Hash 这个单词一方面指代一种数据类型,元素是由 key 和 value 组成,是一种无序的数列;另一方面也指一种加密算法。在翻译当中,一般指代算法时翻译成
哈希
,指代数据类型时翻译成散列
。 - 散列的
merge
运算
h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 254, "c" => 300 }
h1.merge(h2) #=> {"a"=>100, "b"=>254, "c"=>300}
h1.merge(h2){|key, oldval, newval| newval - oldval}
#=> {"a"=>100, "b"=>54, "c"=>300}
- Ruby 语言非常灵活,这一点在书写格式上很能体现。同一个语句,有很多种写法,有很多符号可以省略。比如说调用方法时,可以加括号,也可以不加括号;如果散列是作为最后一个参数 时,可以加花括号
{}
,也可以不加。这些灵活的格式当然有好处,但是对于初学者来说,有时候可能反应不过来,需要多多适应。 - 例如在 Rails 中,作为 Layout 的
application.html.erb
里有下面这么一句。其实stylesheet_link_tag
是一个方法,这个方法有两个参数,第一个参数是一个字符串application
,第二个参数是一个散列,而这个散列又有两个元素。
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
# 可以写成
<%= stylesheet_link_tag('application', {media: 'all', 'data-turbolinks-track': 'reload'}) %>
# 还可以写成
<%= stylesheet_link_tag('application', {:media => 'all', :'data-turbolinks-track' => 'reload'}) %>
- 注意上面的代码里,
:'data-turbolinks-track'
不能写成:data-turbolinks-track
,否则会报NameError
。 - 同意,在 Model 里做数据验证的
validates
也是一个方法,比如
validates :name, presence: true, uniqueness: true
# 可以写成
validates(:name, presence: true, uniqueness: true)
# 还可以写成
validates(:name, {presence: true, uniqueness: true})
- 即使在 ActiveRecord 层面用
uniqueness
声明了唯一性,比如说用户名,也不能保证在数据库层面的唯一性。在访问量很大的时候,往往会出现这样的问题。所以为了确保数据库的唯一性,要在数据库建立索引,对索引声明唯一性。 - rails 内建了对密码效验的方法,即
has_secure_password
。在 Model 中使用这个方法之后,会产生两个虚拟属性,即password
和password_confirmation
,这两个属性并不会储存在数据库中。同时,要在数据库中增加一个栏位password_digest
,即哈希密码摘要,是一种用哈希算法产生的很难反向解密的字符串。系统内部就会通过根据用户输入的passoword
和数据库中的password_digest
进行校验,从而确认用户的身份。这样一来,用户密码其实并不储存在数据库中,即使数据库被这个拷贝,也无法得到用户的密码。灵位has_secure_password
需要bcrypt
这个 gem 的支持。 - 在 View 页面加入
<%= debug(params) Rails.env.develoment %>
可以在开发时更容易 debug。 - 想要查询一个实例的所有属性,用
.attributes
。 pluralize
的方法挺有意思,可以避免拼写错误,比如puralize(@user.errors.count, "error")
,如果@user.errors.count = 1
,得到的结果是1 error
,如果@user.errors.count = 2
,得到的结果是2 errors
。也就是说,这个方法会智能地为我们判断单复数然后加以转化。在中文里可能用得就比较少了。
这种查漏补缺的过程,有点像给自己脑袋 debug 的过程,很是过瘾。
今天继续把 Ruby on Rails 教程 读完。