本帖最后由 灰儿 于 2010-12-10 14:40 编辑
运行 Rails
创建了 AddressBook/ 目录和所需要的子目录后,您需要执行一次惟一的初始配置。首先,通过修改 YAML 配置文件来设置数据库,如下:
清单 4. 配置数据库访问
[~/Sites]$ cd AddressBook[~/Sites/AddressBook]$ head -6 config/database.yml # after editingdevelopment: adapter: mysql database: AddressBook host: localhost username: some_user password: password_if_needed |
最后,您需要提供数据。Rails 附带了它自己的单一功能的 Web 服务器,即 WEBrick,非常适用于我们的试验。您可能也会遵循 Ruby on Rails Web 站点上的说明来配置 Apache 或者其他服务器,以通过 FCGI(或者普通的 CGI,但是普通的 CGI 将会较慢)向 Rails 应用程序提供服务。
清单 5. 启动 WEBrick 服务器
[~/Sites/AddressBook]$ ruby script/server -d=> Rails application started on http://0.0.0.0:3000[2005-03-21 17:57:38] INFO WEBrick 1.3.1[2005-03-21 17:57:38] INFO ruby 1.8.2 (2004-12-25) [powerpc-darwin7.8.0] |
创建一些内容
要在 WEBrick 端口上看到一个欢迎页面,先前的步骤就足够了。例如,在我的本地系统中,现在可以访问 http://gnosis-powerbook.local:3000/。不过,为了操作定制数据库,需要生成稍微多一些代码。可以使用脚本 generate 来完成此任务,这个脚本创建在 AddressBook/ 应用程序目录中:
清单 6. 支架模型和控制器代码的生成
[~/Sites/AddressBook]$ ruby script/generate model contact exists app/models/ exists test/unit/ exists test/fixtures/ create app/models/contact.rb create test/unit/contact_test.rb create test/fixtures/contacts.yml[~/Sites/AddressBook]$ ruby script/generate controller contact exists app/controllers/ exists app/helpers/ create app/views/contact exists test/functional/ create app/controllers/contact_controller.rb create test/functional/contact_controller_test.rb create app/helpers/contact_helper.rb |
注意,在相应的表名中,这里应该使用单数的 contact,而不是复数的 contacts。
现在需要编辑一个或多个生成的文件(只需稍加编辑)来让控制器去使用支架:
清单 7. 告知控制器去使用支架
[~/Sites/AddressBook]$ cat app/controllers/contact_controller.rbclass ContactController < ApplicationController model :contact scaffold :contactend |
现在可以通过类似于 http://rails.server/contact/ 的 URL (在我的测试用例中是 http://gnosis-powerbook.local:3000/contact/)来查看和修改数据库的内容。输入一些数据后,它看起来如图 1 和图 2 所示:
图 1. 列出联系人
图 2. 编辑联系人
创建可定制的内容
前面的代码创建了一个查看和修改数据库的功能完全的界面,不过,所有格式化、显示以及业务逻辑(比如本来就有的)都由 Rails 动态完成,没有任何重大修改。为了创建一些更为定制的内容,需要生成更多一些代码。现在我们所需要的是让 Rails 显式地写出它在运行时隐式地生成的所有支架,以使得我们能够修改它。
图 8. 显式控制器和视图代码生成
[~/Sites/AddressBook]$ ruby script/generate scaffold Contact dependency model [...] create app/views/contacts exists test/functional/ create app/controllers/contacts_controller.rb create test/functional/contacts_controller_test.rb create app/helpers/contacts_helper.rb create app/views/layouts/contacts.rhtml create public/stylesheets/scaffold.css create app/views/contacts/list.rhtml create app/views/contacts/show.rhtml create app/views/contacts/new.rhtml create app/views/contacts/edit.rhtml |
现在有了更多一些要做的,所以尝试去修改一些内容。(注意此代码已经重新使用了复数格式 contacts,我不清楚其原因;现在我们需要接受它。)尝试在 CSS 中修改一些颜色和字体:
清单 9. 配置层叠样式表单
[~/Sites/AddressBook]$ head -8 public/stylesheets/scaffold.cssbody { background-color: #ffe; color: #338; }body, p, ol, ul, td { font-family: verdana, arial, helvetica, sans-serif; font-size: 13px;}td { border: 1px solid; }a { color: #eef; background-color: #446; }a:hover { color: #fff; background-color:#000; } |
您已经拥有了这段代码,那么 contacts_controller.rb 做什么?就其操作而言,它比前面的代码中所出现的 contact_controller.rb 更为显式且可配置。控制器类似如下:
清单 10. 控制器 app/controllers/contacts_controller.rb
class ContactsController < ApplicationController def list @contacts = Contact.find_all end def show @contact = Contact.find(@params['id']) end def create @contact = Contact.new(@params['contact']) if @contact.save flash['notice'] = 'Contact was successfully created.' redirect_to :action => 'list' else render_action 'new' end end |
如前所述,控制器的主要任务是将数据导入到变量之中。对象 Contact 是模型所提供的 ActiveRecord 对象-关系映射。变量 @contacts 或者 @contact 是它们的适当方法中所给出的数据。通过 URL 可以访问那些方法本身,比如 http://rails.server/contacts/show/2 (这一个方法显示出 id 为“2”的联系人)。
此示例中的控制器最终连接到了视图,即 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 中的流控制标签从数组中取出单个的记录。
|