使用XForms和Ruby on Rails开发小型门诊管理系统,第2部分 - 编程入门网
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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |