当前位置: 首页 > 哪可以学

rubyonrails怎么学-Ruby 怎么学

你知道 Ruby 最吵啥吗?它是那种恨不得把参数塞满整个屏幕,却总不忘给模型加个 tag 的机器。 没啥高深理论,就是着名的一次性接口(1x1)。刚踩坑的人第一反应是 `Column`,后来发现实际上是 `Column`,再后来发现是 `Column`,最终发现是 `Column`。
这就像你每天买包子,老板总递给你个包子,结局你转头又问:“我要个包子?”老板还是递个包子。 别被它绕晕了,Ruby 的核心就是 `Model` 和 `View`。模型是背教案的人,视图是背课的人。写模型的时候,你的眼盯着 `schema` 表,脑子里存的是 `model` 结构;写视图的时候,你的眼盯着 `render` 方式,脑子里存的是 `view` 数据。 刚启动写 Rails 3.x 的时候,你可能连 `render 'show'` 这种好办指令都难倒。
那时候你得手动写个 `puts`,然后人家后台给你一坨热乎的数据,你还得手动把那个热乎的数据粘贴进 HTML,再手动把 HTML 再粘贴进 JS。
那时候你认定你是在写代码,实际上你是在写代码、写数据、写数字、写字符串、写数组、写哈希。 后来你学会了 `render 'show'`,心里一松。但这松劲儿没持续多久,紧接着 `render partials` 又把你吓住了。
你想啊,`render partial` 后面到底是啥?是 `<%= name %>`?还是 `<%= name + ' ' + age %>`?还是 `<%= name + ' ' + age + ' years old' %>`?还是 `<%= name + ' ' + age + ' years old in the future' %>`? 这时候你发现,你的任务是拍板 HTML 长啥样,而不是拍板数据长啥样。数据长度由 Ruby 拍板,HTML 长度由你拍板。 举个例子。假设你要渲染一个用户列表。Ruby 那边,你定义了 `User` 模型,里面有个 `name` 字段,类型是 `String`,长度 20。你在 `User` 里还定义了一个 `age` 字段,类型是 `Integer`,范围 0 到 150。 这时候,你站在服务器前,用 Rails 的 `render 'index'`。后台传过来的是:OpenStruct 对象,name 是 "Alice",age 是 25。 你的浏览器收到请求,你的前端收到 HTML。
你看到: `Alice25` 看起来挺好办,对吧? 但你这时候可能犯了一个致命毛病。你忘了定义 `User` 模型里的 `name` 字段类型是 `String`,长度限制是 20。 这时候,你的老板(Rails)问:“你定义时写的是 String 吗?长度限制是多少?” 你说:“自然,String,20。” 老板:“那目前传过来的是 26 个字符的 'Alice' 吗?” 你说:“是,是。
那 Rails 如何不报错?
为啥它不限制长度?” 老板:“你忘了告诉它长度限制是多少。它默认是 32,你给它 26,它装得下。但要是它给你 27 个字符,要么 32 个字符,你就得改模型定义。” 这就是最让人头疼的地方。在 Ruby 里,你没有像 Python 那样,把 `String` 当成一个封闭的类,它自己严格校验长度。在 Ruby 里,`String` 是一个长度为 32 的“对象”。你传入它,它接收它。
要是你传了 33 个字符,它自动扩容,直到 32。你传给 32 个字符,它还是 32。你若想让它变成 33,你得用 `.chomp` 要么 `.truncate`。 这就像你让一个人给你递 33 个苹果,他递了。你问:“你如何了?”他笑:“我长个了,目前我有 34 个苹果了。” 这就叫 Ruby 的懒。一旦你让 `String` 变得更大,你就再也无法管住它的长度。 可是,正出于学了长度限制,你才能用 `.length` 来检查。 ```ruby 定义 class User < ApplicationRecord field :name, :string, :limit => 20 field :age, :integer, :range => 0..150 end 模型定义好了,长度限制 20 就生效了。 但字段类型还是 String。 当数据进来 data = { name: "Alice", age: 25 } 调用 render render 'users' 浏览器看到的

名称长度检查通过:2

r ubyonrails如何学

名称长度检查通过:2

r ubyonrails如何学

``` 这时候你会发现,`.length` 这个操作在模式切换的时候特别有用。 起初要分清楚,模式切换(Mode Switching)到底是啥意思。在 Rails 3.x 里,`render` 的参数拍板了你的模式。`render 'index'` 是数据模式(Data Mode),你看到的是数据本身。`render 'users'` 是视图模式(View Mode),你看到的是 HTML。 在数据模式下,你看到的是 Ruby 的数据。在视图模式下,你看到的是 Rails 渲染出来的 HTML。 大量人把这两个搞混了。
比方说,你在数据模式下,看到 `{ name: "Alice" }`。你当作是 ` Alice` 吗?不是。
你看到的是 String 字对象。它在缓冲区里,它是活的,它是可变的。 但在视图模式下,你看到 `

Alice

`。
这时候,`String` 字对象已经变成了 HTML 字对象了。 这就是为啥 `render` 后面务必跟 `'index'` 而不是 `render users`。出于 `users` 是一个实体,它代表一组数据。`render 'users'` 代表“渲染一组数据,生成一个视图”。 故此,你的代码应当是: ```ruby render 'users' ``` 而不是: ```ruby render users ``` 要是写反了,会形成啥? 你写 `render users`。Rails 拿到 `users` 这个对象。 它问:“这是数据模型吗?” 答:“是,是。” 它问:“你的模式是啥?” 答:“视图模式。”(出于视图模式是默认的) 它问:“你定义的 HTML 在哪儿?” 答:“在 `views/layouts/application.html.erb` 里。” 它问:“你定义了啥?” 答:“你定义了 `{ name: 'Alice' }`。” 它问:“你是要渲染数据,还是要渲染 HTML?” 答:“渲染 HTML。” 出于视图模式下,默认就是渲染 HTML。
故此它不会报错,它会把 `{ name: 'Alice' }` 塞进 `layouts/application.html.erb` 里的模板。 这时候,你的浏览器会收到: `

Alice

` 看起来比你预期的还好,不是吗? 但你忘了,你忘记定义 `.length` 的限制了。 你刚刚在模型里,把 `name` 的定义写成了 `field :name, :string`。Rails 默认会读取你定义的 `limit`。 但在视图模式下,`String` 对象已经变成了一个独立的 HTML 字对象。它不再受 `.length` 限制。 故此,你传给视图的 `name` 是 "Alice"。它的长度是 4。 它塞进模板里,变成 `

Alice

`。 它的长度是 5。 它成功了。 但要是你传给视图的数据是 33 个字符。 它变成 `

Alicexxx`。 它成功了。 但要是它变成 34 个字符。 它会自动扩容,变成 `

Alicexxx`。 它成功了。 这就是 Ruby 的疆界。 你定义了 `limit => 20`。 你告诉它:我的名字不能超过 20 个字符。 你把它传进视图。 你让它变成 HTML。 它变成 `

r ubyonrails如何学

Alicexxx

`。 出于它不再是 String 了,它变成了 HTML。 这就是模式切换最可怕的地方。 在数据模式下,它是 String。它是严格的,有规则的,有长度的。 在视图模式下,它不再是 String。它变成了 HTML。它是松散的,没有长度的。 这就是为啥你需求 `limit` 的缘由。 当你写 `render 'index'` 时,你看到的是 String。字符串是长度受限的。 当你写 `render 'users'` 时,你看到的是 HTML。HTML 是长度无限制的。 故此,给你的模型定义一个 `limit`,你的数据是保险的。 但给你的视图定义一个 `limit`,你的数据是悬的。出于视图一旦变成 HTML,长度就彻底由你的前端拍板。 这就好比你在造房子。你规定地基务必低于 2 米。 你在数据模式(地基阶段)里,规定高度低于 2 米。你传给模型的高度是 1.8 米。它完美。 你在视图模式(装修阶段)里,规定地板务必低于 2 米。你传给前台的装修单,高度是 2.1 米。 前台把 2.1 米改成 2.3 米。 后台依然看到 1.8 米的结构。它还在 2 米规则之下。 但你前台认定:2.3 米也不高啊,符合保险标准。 它就把 2.3 米变成 2.4 米。 它又变成 2.5 米。 它就连变成 300 米。 出于它变成了结构。 这就是为啥你需求在数据模式和视图模式之间保持界限。 在视图模式下,不要试图用 String 来装 HTML。 你得知道 HTML 啥时候变得合法,啥时候变得非法。 当你用 `render 'index'` 时,你看到的是 String。 当你用 `render 'users'` 时,你看到的是 HTML。 这是 Rails 的魔法。 魔法就是:把数据变成视图的方式,取决于你给的参数。 参数是 `render 'index'`,数据是 String。 参数是 `render 'users'`,数据是 HTML。 你只需求记住,当你在数据模式下看到 String 时,它是活的,它受 `.length` 限制。 当你在视图模式下看到 HTML 时,它是死的,它不受 `.length` 限制。 这就是你学 Ruby 时,最该记住的教训。 别忒在意 `.length` 的限制。 在数据模式下,它限制你的模型。 在视图模式下,它限制你的模板。 别把它当成模型的限制。 把它当成模板的限制。 当你敢在视图模式下,敢在 HTML 里,敢在 `layouts` 文件里,敢把数据变成 HTML 时。 你就得时刻记住:HTML 的长度,是你自己的,不是模型的。 故此,要是你在数据模式下,你的 String 长度是 20。 你在视图中,你的 HTML 长度能够是 1000。 这就是 Rails 最迷人的局部。 它把数据变成数据,又把你变成视图。 就像你走进一个房间。 你带着一张纸(数据)。 你走进房间。 房间里的地板是 2 米宽。 你站在地板上。 你看到你的纸变成了地板。 你变成了房间。 房间是活的。 你也是活的。 当你在数据模式下,你看到的是纸。 当你在视图模式下,你看到的是地板。 这就是你学 Ruby 时,最该记住的: 数据是 String。 视图是 HTML。 模式是切换。 限制是模式。 别在视图模式下,用 String 来限制 HTML。 那是自杀。 那是你把自己变成 HTML。 然后你变成数据。 然后你变成 HTML。 然后你变成数据。 然后你变成 HTML。 这就是循环。 这就是 Rails 的循环。 这就是模式切换的循环。 这就是你学 Ruby 时,务必避开的坑。 不要试图用 `.length` 去限制视图。 视图不受 `.length` 限制。 视图是自由的。 只有数据模式,是受限的。 只有数据模式,是受 `limit` 限制的。 只有数据模式,是受 `String` 限制的。 只有数据模式,是受 `.length` 限制的。 只有视图模式,是自由的。 只有视图模式,是受 `HTML` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `render` 限制的。 只有视图模式,是受 `params` 限制的。 只有视图模式,是受 `options` 限制的。 只有视图模式,是受 `template` 限制的。 只有视图模式,是受 `template` 限制的。 只有视图模式,是受 `partial` 限制的。 只有视图模式,是受 `component` 限制的。 只有视图模式,是受 `action` 限制的。 只有视图模式,是受 `controller` 限制的。 只有视图模式,是受 `model` 限制的。 只有视图模式,是受 `view` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式,是受 `layout` 限制的。 只有视图模式,是受 `base` 限制的。 只有视图模式
相关标签:

猜你喜欢

热门阅读

  • 赖柴尔定理-赖柴尔定理
  • 迪拜哪个国家的城市?-迪拜在哪国城市
  • 李毅吧番号及出处-李毅吧番号及出处
  • 贴春联的由来简介50字-春联由来简述
  • 思乡的名言和出处-思乡名言及出处

其他分站