Ruby on Rails 入门:我希望当初就知道的事

Ruby on Rails 是一种优雅、简洁且有趣的构建Web应用程序的方式。不幸的是,许多陷阱等待着新手程序员。既然我已经有了一些 Rails项目 经验,我想尽力让你免于我在刚开始时所经历的痛苦。

工具:直接获取它们

以下是您需要的工具。不要为了决定哪个最好而阅读无尽的评论;从某个开始,然后行动起来。

但这到底意味着什么?

“Ruby on Rails”这个名称很吸引人但令人困惑。Rails是Ruby所服用的一种神奇药物吗?(取决于你问谁,是的。)

Ruby 是一种编程语言,类似于Python和Perl。它是动态类型的(不需要“int i”),解释型,并且可以在运行时修改(例如向类添加新方法)。它有几十个快捷方式,使其非常简洁;方法很少超过10行。它对正则表达式有很好的支持,并且适用于Shell脚本。

Rails 是一种 gem,即一个Ruby库。有些gem允许你使用Win32 API. 其他的处理网络。Rails帮助构建Web应用程序,提供用于保存到数据库、处理 URL并显示HTML的类(以及Web服务器、维护任务、调试控制台等更多功能)。

IRB 是交互式Ruby控制台(输入“irb”使用)。Rails有一个特殊的 IRB 控制台,可以在你的Web应用运行时访问它(非常适合实时调试)。

Rake 是Ruby版本的Make。定义并运行维护任务,例如设置数据库、重新加载数据、备份,甚至将应用程序部署到你的网站。

Erb 是嵌入式Ruby,类似于 PHP。 它允许你将Ruby与 HTML (例如):

<div>Hello there, <%= get_user_name() %></div>

YAML (或 YML) 意思是“YAML Ain’t a Markup Language”——它是一种简单的方式来 指定数据:

{name: John Smith, age: 33}

它就像 JSON, 比...精简得多 XML, ,并且被Rails用来设置配置选项(比如设置数据库名称和密码)。

呼!一旦Ruby安装好并加入路径,你可以使用以下命令添加rails gem:

gem install rails

通常,使用 gem install “gem_name”,它会在网上搜索该库。虽然Rails“只是另一个gem”,但它是让Ruby备受关注的杀手级库。

理解Ruby惯用法

同时学习一个新库和新语言让人望而生畏。以下是一些对于有C/C++/Java背景的人而言,Ruby最大的坑。

Ruby移除了不必要的累赘:(){};

  • 方法调用中的圆括号是可选的;使用 print "hi".
  • 每行结束后不需要分号(我知道这很疯狂)。
  • 使用“if then else end”而非大括号。
  • if-then语句中的条件不需要用圆括号括起来。
  • 方法自动返回最后一行(如果需要,显式调用 return 显式调用)

Ruby去掉了那些烦人、随处可见的标点符号,这些符号会分散对程序逻辑的注意力。为什么要加括号((到处)括号)?同样,如果你想用括号,那就加上。但很快你就会摆脱这些辅助轮。

我们在C和Java中使用的那些行噪声(呃,“标点符号”)是为了编译器的利益,而不是我们的。警告:用了Ruby几周后,其他语言读起来会有点痛苦。

def greet(name)              # simple method
   "Hello, " + name          # returned automatically
end

greet "world"                # ==> "Hello, world"

那些有趣的Ruby变量(Those Funny Ruby Variables)

  • x = 3 是方法或块的局部变量(方法结束后消失)
  • @x = 3 是每个对象拥有的实例变量(它会一直存在)
  • @@x = 3 是所有对象共享的类变量(它也会一直存在)。
  • :hello 是一个符号(Symbol),类似常量字符串。用于索引哈希(Hash)。说到这个……
  • dictionary = { :cat => "Goes meow", :dog => "Barks loud."} 是一个键/值对的哈希。使用……访问元素 dictionary[:cat].

那些有趣的Ruby赋值(Those Funny Ruby Assignments)

Ruby有一个 || 运算符,看起来有点奇怪。当用于链式表达时

x = a || b || c || "default"

意思是“测试每个值,返回第一个不为假的值”。所以如果a为假,则尝试b。如果b为假,则尝试c。否则,返回字符串“default”。

如果你写 x = x || "default" 意思是“将x设为其自身(如果它有值),否则使用默认值。”更简单的写法是

x ||= "default"

意思相同:将x设为默认值,除非它有其他值。你会在Ruby程序中经常看到这个。

那些有趣的Ruby块(Those Funny Ruby Blocks)

Ruby有“块(block)”,就像匿名函数,传递给循环或其他函数。这些块可以使用|param|指定参数,然后执行操作、调用自己的函数等等。块在对数组的每个元素应用某些函数时很有用。可以把它们看作一种匿名函数,可以(但不是必须)接受参数。

3.times do |i|
   print i*i
end

在这个例子中,数字0、1和2被传递给一个块(do… end),该块接受一个参数(i)并打印i的平方。输出将是0,然后是1,然后是4(由于我们没有加空格,看起来像“014”)。块在Ruby中很常见,但需要一些时间来适应,所以提前警告。

这些是入门时容易混淆的Ruby课程。试试 Why's Poignant Guide To Ruby 获取更多信息(“Why”是作者的名字……这当初也让我困惑过)。

理解Rails惯用法

Rails有自己的特点。“相信我们,这对你有好处。”程序员们说。的确——这些特性/怪癖让Rails脱颖而出,但在真正理解之前会让人困惑。记住:

  • 类和表名很重要。 Rails有特定的命名约定;它期望来自该类的对象 Person 被保存到名为的数据库表中 people。是的,Rails有一个 复数化引擎(pluralization engine) 来确定哪个对象映射到哪个表(不开玩笑)。这种魔法很棒,但一开始当你不知道类和数据表是如何关联时会感到害怕。
  • 许多方法接受一个“options”哈希作为参数,而不是有几十个单独的参数。当你看到

    link_to “View Post”, :action => ‘show’, :controller => ‘article’, :id => @article

这个调用实际上做了以下事情:

link_to("View Post", {:action => 'show', :controller => 'article', :id => @article})

只有两个参数:名称(“View Post”)和一个包含3个键值对的哈希。Ruby允许我们去掉多余的括号和大括号,留下上面那种简化的函数调用。

理解模型-视图-控制器模式

Rails是围绕 模型-视图-控制器 模式构建的。这是一个简单的概念:将程序的数据、逻辑和显示层分开。这让你能够干净地分离功能,就像分开的 HTML, CSS 和Javascript文件可以防止代码混在一起一样。下面是 MVC 的分解:

  • 模型 是与数据库交互的类。你查找、创建和保存模型(models),这样你通常就不必编写 SQL. Rails有一个类来处理在模型更新时保存到数据库的魔法。
  • 控制器 获取用户输入(比如一个 URL)并决定要做什么(显示页面、下单、发表评论)。它们最初可能包含业务逻辑,比如查找正确的模型或更改数据。随着你的Rails忍者技巧的提高,不断重构并将业务逻辑移到模型(胖模型,瘦控制器)中。理想情况下,控制器只需接收输入,调用模型方法,并将输出(包括错误信息)传递给视图。
  • 视图 显示输出,通常是 HTML. 它们使用 ERB 而Rails的这一部分类似于 PHP – 你使用 HTML 模板,并嵌入一些Ruby变量。Rails还使得创建视图变得容易,比如作为 XML (用于Web服务/RSS订阅)或 JSON (用于 AJAX 调用)。

这个 MVC 模式是构建可读、可维护且易于更新的Web应用的关键。

理解Rails的目录结构

当你创建第一个Rails应用时,目录已经为你布置好了。结构组织得很好:模型在app/models中,控制器在app/controllers中,视图在app/my_local_views中(开个玩笑)。

命名约定很重要——它让Rails应用能够轻松“找到自己的部件”,而无需额外配置。此外,其他程序员也很容易理解和学习任何Rails应用。我可以看看Typo(Rails博客软件),并在几分钟内很好地了解它的工作原理。一致性创造了理解。

理解Rails的脚手架

脚手架为你提供了默认的控制器动作(要访问的URL)和视图(要填写的表单)来与你的数据交互——你不需要自己构建界面。你只需要定义模型并创建数据库表。

把脚手架想象成你可以用来与应用交互的“默认”界面——随着应用的构建,你会慢慢覆盖默认的部分。你在控制器中用一行代码指定脚手架:

scaffold :person

它添加了默认的动作和视图,用于显示、编辑和创建你的“Person”对象。Rails表单需要一些时间来适应,所以在初始阶段脚手架非常有帮助。

更多技巧和窍门

我最初计划列出一些在学习Rails时觉得有用的技巧和诀窍。但我很快意识到Ruby on Rails实际上需要很多背景知识,尽管(或因为)它的“魔法”,它仍然可能令人困惑。我将在下一篇文章中介绍我最喜欢的技巧。

随着你进一步深入Web开发,这些指南可能会有所帮助:

下次再见,欣赏这些有趣的视频:

本系列其他文章

  1. Ruby on Rails 入门:我希望当初就知道的事
  2. Rails 进阶:理解模型(Model)、视图(View)和控制器(Controller)
  3. Javascript 简明而全面概述
  4. 使用 JSON 交换数据
  5. 如何为你的 Web 应用制作一个书签工具(Bookmarklet)

加入 45 万月度读者

喜欢这篇文章?还有更多内容能帮你建立持久、直观的数学理解。加入通讯以获取额外内容和最新更新。