快速业务通道

使用XForms和Ruby on Rails开发小型门诊管理系统,第2部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
n

Rails 模型和控制器

使用 Rails scaffolding 可以加快应用程序的开发。很多 Rails 应用程序中,不需要修改控制器,就可以直接使用 scaffolding 处理和数据库的交互。通过利用 Rails ActiveRecord 类的对象-关系映射代码,这是可以实现的,该类是所有模型的基类(包括 patient 类)。ActiveRecord 最初并非用于处理 XML,因此需要修改生成的类。首先看看清单 6 所示的 patient 类。

清单 6. 默认的 patient 类

class Patient < ActiveRecord::Base
end

可以看到,默认情况下 Patient 类仅仅扩展了 ActiveRecord。ActiveRecord 根据映射的数据库表的列名动态创建访问器。它有一个构造函数接受名称/值对作为参数。应用程序控制器利用它直接传入表单数据。利用这一点我们来修改 patient 类,如清单 7 所示。

清单 7. 修改后的 patient 类

require ''rexml/document''
class Patient < ActiveRecord::Base
def information=(value)
self[:information] = value.to_s
end
end

变动不大,但是很重要。我们希望在内部用字符串保存信息,这样在 ActiveRecord 将信息插入数据库的时候就能序列化为字符串。但是传递给模型的时候呢?由控制器来完成。清单 8 显示了默认的控制器。

清单 8. 默认的 Kiosk 控制器

class KioskController < ApplicationController
def index
list
render :action => ''list''
end
# GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
verify :method => :post, :only => [ :destroy, :create, :update ],
:redirect_to => { :action => :list }
def list
@patient_pages, @patients = paginate :patients, :per_page => 10
end
def show
@patient = Patient.find(params[:id])
end
def new
@patient = Patient.new
end
def create
@patient = Patient.new(params[:patient])
if @patient.save
flash[:notice] = ''Patient was successfully created.''
redirect_to :action => ''list''
else
render :action => ''new''
end
end
def edit
@patient = Patient.find(params[:id])
end
def update
@patient = Patient.find(params[:id])
if @patient.update_attributes(params[:patient])
flash[:notice] = ''Patient was successfully updated.''
redirect_to :action => ''show'', :id => @patient
else
render :action => ''edit''
end
end
def destroy
Patient.find(params[:id]).destroy
redirect_to :action => ''list''
end
end

使用XForms和Ruby on Rails开发小型门诊管理系统,第2部分(8)

时间:2011-11-29 ibm Michael Galpin

前面已经把 XForms 的动作 URL 定义为 /kiosk/create,因此将调用上面的 create 方法。Rails 认为提交的时候获取的是一系列 HTML 表单元素而不是 XML 文档。因此需要修改这个方法以便解析 XForms 发送的 XML 文档。清单 9 显示了修改后的 create 方法。

清单 9. 修改后的 create 方法

 def create
doc = REXML::Document.new("<Info></Info>")
params[:Info].each_pair do |key,value|
if (key.index('':'') == nil) #namespace attributes
el = REXML::Element.new key
el.add_text value
doc.root.add el
else
doc.root.add_attribute key,value
end
end
@patient = Patient.new
@patient.information = doc
if @patient.save
flash[:notice] = ''Patient was successfully created.''
redirect_to :action => ''list''
else
render :action => ''new''
end
end

首先要注意,这里使用 REXML 创建 XML 文档。REXML 是 Ruby 提供的一个标准

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号