使用Ruby on Rails快速开发web应用的教程实例

2019-09-25 09:43:24于海丽

此示例中的控制器最终连接到了视图,即 RHTML 文件,它们使用的是控制器导入到变量中的数据值。例如,这里是 list 视图的一部分:
清单 11. 列出视图 app/views/contacts/list.rhtml

[...]
<% for contact in @contacts %>
 <tr>
 <% for column in Contact.content_columns %>
  <td><%=h contact.send(column.name) %></td>
 <% end %>
  <td><%= link_to 'Show', :action => 'show', :id => contact.id %></td>
  <td><%= link_to 'Edit', :action => 'edit', :id => contact.id %></td>
  <td><%= link_to 'Destroy', :action => 'destroy', :id => contact.id %></td>
 </tr>
<% end %>
[...]

方法 ContactsController.list 导入变量 @contacts,RHTML 中的流控制标签从数组中 取出单个的记录。

修改模型

初始的模型只包含联系人的名字。不幸的是,本文中我已经没有余地扩展这个模型以使其包含实际的联系人数据,比如电话号码、地址、电子邮件等等。通常,那些数据 应该存放在一张子表中,子表的外部关键字关联到表 contacts。Rails 模型会使用类似这样的定制代码来指明关联:
清单 12. 定制代码 appmodelsphone.rb

class Phone < ActiveRecord::Base
 belongs_to :contact
end

在结束之前,让我们来对数据模型稍加修改,以查看它如何影响应用程序。首先,添加一列:
清单 13. 向模型添加 first_met 数据

$ cat add-contact-date.sql
USE AddressBook;
ALTER TABLE contacts ADD first_met date;
$ cat add-contact-date.sql | mysql

既然已经修改了底层的模型,http://rails.server/contact/ —— 支架的后台版本 —— 就会直接调整过来,不需要您做什么。 控制器和视图是完全自动基于模型的。不过,在 http://rails.server/contacts/ 上应用程序版本使用了我们手工编写的文件, 并不是那样自动化的。

list 视图将 Contact.content_columns 作为模板循环的一部分,能够 自动查找 所有 的列,不管它们是什么。不过,edit 等其他视图已经被生成了,需要添加新的 数据域。例如:
清单 14. 编辑视图 app/views/contacts/edit.rhtml

<h1>Editing contact</h1>
<%= error_messages_for 'contact' %>
<%= start_form_tag :action => 'update' %>
<%= hidden_field 'contact', 'id' %>
<p><label for="contact_name">Name</label><br/>
 <%= text_field 'contact', 'name' %></p>
<p><label for="first_met">Known Since</label><br/>
 <%= date_select "contact", "first_met", :use_month_numbers => false %></p>
<input type="submit" value="Update" />
<%= end_form_tag %>
<%= link_to 'Show', :action => 'show', :id => @contact.id %> |
<%= link_to 'Back', :action => 'list' %>