icon 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) %>

再次刷新任务列表的话,类型下面便显示出下划线。

画面キャプチャ1

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

画面キャプチャ2


让我们分析一下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动作的。

再次刷新任务列表,显示出编辑、完成、删除的链接。

画面キャプチャ3


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

画面キャプチャ4

这是正常现象。错误信息应该是“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

点击“删除”链接后,便出现下面这个对话框。

画面キャプチャ5

这里点击“取消”的话就恢复原样。点“OK”的话就删除任务。

(2010/01/31)