Agile Web Development with Rails 翻译(七)
1、用户导航到我们应用程序。我们要做是使用本地URL如http://localhost:3000/say/hello。
2、Rails分析URL。say部分是“控制器”的名字,所以Rails创建一个Ruby类SayController的新实例(这个类在app/controllers/say_controller.rb中被找到)。
3、URL路径的下个部分,hello,标识了一个“动作”。Rails调用“控制器”内这个名字的方法。这个“动作”方法创建一个新的Time对象来持有当前时间,并放入到实例变量@time中。
4、Rails查看用于显示结果的模板。它搜索目录app/view来查找与“控制器”同名的子目录,然后在子目录中查找文件名hello.rhtml。
5、Rails通过ERb来处理这个模板,运行所有被植入的Ruby代码,并用“控制器”设置的值替换它。
6、发送结果给浏览器,Rails完成对这个请求的处理。
这并不是全部故事—Rails给你很多机会来重写基本工作流(稍后我们会看看这些优点)。现在,我们显示了配置约定,Rails的基础部分。通过提供方便的缺省值和应用某些约定,Rails应用程序典型地使用了很小的,甚至可无的额外配置—这是将它们自己编织在一起的最自然的方式。
4.3 将页面链接在一起
未经加工的Web应用程序只有一个页面。让我们看看如何添加其它的页面到Hello,World!应用程序中。
通常,你的应用程序内每个页面的风格是对应于一个单独的“视图”。在我们的例子中,我们也将使用一个新的“动作”方法来处理页面(尽管并不总是这样,像在本书稍后看到的)。我们给两个“动作”使用同样的“控制器”。我们并不是强迫用户使用新的“控制器”。
我们已经知道如何添加一个新的“视图”和“动作”给Rails应用程序。要添加“动作”,我们在“控制器”内定义个新方法。让我们称这个新方法为goodbye。我们的“控制器”现在看起应该这样。
class SayController < ApplicationController
def hello
@time = Time.now
end
def goodbye
end
end
下一步,我们必须在app/views/say目录内创建一个新“模板”。这次称它为goodbye.rhtml,因为缺省模板的名字是相应的“动作”名。
<html>
<head>
<title>See You Later!</title>
</head>
<body>
<h1>Goodbye!</h1>
<p>
It was nice having you here.
</p>
</body>
</html>
再次启动浏览器,但这次是指出我们的新“视图”,使用这个URL http://localhost:3000/say/goodbye。你应该看到图4.6样的东西。
现在我们需要将两个页面连在一起。我们要在hello页面内放个链接,指向goodbye页面,反过来也是一样。我们可能想用些适当的按钮,但现在我们只有超链接,hyperlinks。
我们已经知道Rails使用一个约定来解析URL到一个目标“控制器”内,并使用这个“控制器”内的一个“动作”。所以简单的途径是让我们的URL符合这个约定。文件hello.rhtml将包含下面这些。
<html>
…..
<p>
Say <a href="/say/goodbye">GoodBye</a>!
</p>
</html>
同样,goodbye.rhtml是这样。
<html>
….
<p>
Say <a href="/say/hello">Hello</a>!
</p>
</html>
这种方式的确可以工作,但是它还有个缺点。如果我们想移动我们的应用程序到Web服务器的不同目录时,这个URL就不再有效了。它也把Rails的URL格式编码进我们的代码中;或许将来Rails会修改这个格式。
幸运地,我们不会遇到些危险。Rails带有一组“帮助”方法,它们可以使用在“视图”模板内。这儿,我们将使用“帮助”方法link_to(),它为“动作”创建一个超链接。使用link_to()的hello.rhtml变成这样。
<html>
<head>
<title>Hello, Rails!</title>
</head>
<body>
<h1>Hello from Rails!</h1>
<p>
It is now <%= @time %>.
</p>
<p>
Time to say
<%= link_to "GoodBye!", :action => "goodbye" %>
</p>
</body>
</html>
在ERb<%=…%>序列内调用link_to()。这创建了一个调用goodbye()“动作”的URL连接。它的第一参数是要显示在超链接内的文本,下一个参数告诉Rails生成指向goodbye“动作”的连接。不需要我们指定“控制器”,当前的“控制器”会被使用。
让我们停一下,想想link_to()的最后一个参数。我们写
link_to "GoodBye!", :action => "goodbye"
:action部分是Ruby的符号。你可想冒号:的意思是某物的名字…,所以,:action的意思是某物的名字是action。=>"goodbye"将字符串goodbye与名字action关联起来。这可有效地使我们可以为方法使用关键字参数。Rails扩展了个功能的用途—无论何时,方法都可接受一定数量的参数,并且这些参数一部分是可选的,你可以使用关键字参数功能来给出这些参数的值。
好了,回到应用程序中。如果我们指定浏览器在我们的hello页,它现在将包含指向goodbye页的连接,像图4.7。
我们在goodbye.rhtml内也做出相应修改,连接它提向最初的hello页。
<html>
<head>
<title>See You Later!</title>
</head>
<body>
<h1>Goodbye!</h1>
<p>
It was nice having you here.
</p>
<p>
Say <%= link_to "Hello", :action=>"hello" %> again.
</p>
</body>
</html>
4.4 我们刚才做了些什么
本章,我们构造了一个玩具应用程序。做了些:
1、 如何创建一个新Rails应用程序和如何在这个应用程序内创建个新的“控制器”。
2、 Rails 是如何映射请求给你的代码调用的。
3、 如何在“控制器”内创建动态内容并显示在“视图”模板内。
4、 如何将页面连接在一起。
这是最根本的基础。现在让我们构造个真实的应用程序。
到现在为止的故事
让我们简短地回忆一下我们当前应用程序是如何工作的。
2006年4月16日更新