名称长度检查通过:2

名称长度检查通过:2

Alice
`。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。 它变成 `

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` 限制的。 只有视图模式