此示例中的控制器最终连接到了视图,即 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' %>










