Ruby on Rails 逐步进阶
STEP 4: 记录详情显示与删除
继续进行任务管理功能的操作。
先来看一下详情页面。
在Tasks控制器上添加show动作。
$ edit app/controllers/tasks_controller.rb
class TasksController < ApplicationController
def index
@tasks = Task.all(:order => 'due_date')
end
def show
@task = Task.find(params[:id])
end
end
生成show动作用的模板。
$ edit app/views/tasks/show.html.erb
<h1>任务详情</h1>
<table class="attributes">
<tr>
<th>类型</th>
<td><%= h @task.subject %></td>
</tr>
<tr>
<th>日期</th>
<td><%= @task.due_date.strftime('%Y/%m/%d') %></td>
</tr>
<tr>
<th>完成</th>
<td><%= @task.done? ? 'Yes' : '' %></td>
</tr>
<tr>
<th>注释</th>
<td><%= simple_format @task.note %></td>
</tr>
</table>
在CSS文件上添加详情页面用的的描述。
$ edit public/stylesheets/application.css
(省略)
table.attributes {
border-collapse: collapse;
margin: 5px auto;
width: 500px;
}
table.attributes td, table.attributes th {
border: 1px solid #000;
padding: 2px;
}
table.attributes th {
text-align: right;
background-color: #cc4;
}
在任务列表页面设置至详情页面的链接。
将12行的
<%= content_tag :td, h(task.subject) %>
做如下修改。
<%= content_tag :td, link_to(h(task.subject), task) %>
再次刷新任务列表的话,类型下面便显示出下划线。

点击类型的话,便显示任务详情。

让我们分析一下index.html.erb修改的部分的源代码的含义吧。
$ link_to(h(task.subject), task)
这个被下面的这个HTML代码置换。
<a href="/tasks/917745139">类型01</a>
变量 task ,对应了特定的Ruby对象。这个对象被称为记录对象 ,对应的是tasks表的特定记录。这个记录的主键为(id)为917745139。
link_to方法的第一参数中指定了链接字符串(用下划线表示的字符串)。
第2参数中可以指定多种对象,像这个例子一样指定了记录对象的情况下,从这个对象的类名("Task")以及主键值生成URL路径。
要理解Rails程序从记录对象中生成URL路径,就必须对路由以及资源的相关知识有深刻的理解。接触这些还为时尚早,先继续下去,找一下感觉吧。
等一下再看任务的添加与编辑,接下来先生成删除功能。
这一节先做“删除”链接。
将15行的
<%= content_tag :td, '' %>
做如下修改。
<%= content_tag :td, operations_on_task(task) %>
生成辅助方法 operations_on_task 。
$ edit app/helpers/tasks_helper.rb
module TasksHelper
def operations_on_task(task)
links = []
links << link_to('编辑', '#')
links << link_to('完成', '#')
links << link_to('删除', task, :method => :delete)
links.join(' | ')
end
end
关于link_to方法的第3 参数指定的:method => :delete选项的含义等一下会讲到。
暂且先理解成这个选项改变的不是show动作的链接对象,而是destroy动作的。
再次刷新任务列表,显示出编辑、完成、删除的链接。

点击“删除”链接的话,出现如下信息。

这是正常现象。错误信息应该是“destroy动作不存在”。这个动作还没有开始做,出现这个信息当然是正常的。
那开始做destroy动作吧。
$ edit app/controllers/tasks_controller.rb
class TasksController < ApplicationController
(省略)
def destroy
@task = Task.find(params[:id])
@task.destroy
redirect_to :tasks
end
end
找到应该删除的记录对象并删除,重定向任务详情页面。
那开始进行实际操作吧。
点击“类型1”的“删除”……确实被删掉了。
但是根据“操作说明”(上一章开头说到过的),删除之前要出现进行确认的弹出窗口。
最后来进行这个的生成操作吧。
$ edit app/helpers/tasks_helper.rb
module TasksHelper
def operations_on_task(task)
links = []
links << link_to('编辑', '#')
links << link_to('完成', '#')
links << link_to('删除', task, :method => :delete,
:confirm => '是否确认删除?')
links.join(' | ')
end
end
点击“删除”链接后,便出现下面这个对话框。

这里点击“取消”的话就恢复原样。点“OK”的话就删除任务。
(2010/01/31)
- 前言
- STEP 1: 从程序的生成到首页的显示 (2010/01/26)
- STEP 2: 布局 (2010/01/29)
- STEP 3: 记录列表 (2010/01/30)
- STEP 4: 记录详情显示与删除 (2010/01/31)

