无数据库模型在rails的form_for表单中的应用

2017-12-15 18:26刘华煜
电脑知识与技术 2017年32期

刘华煜

摘要:rails的ActiveModel作为模型可以应用于不需要数据库存储数据的场合。经过定制,它可以很好地在form_for表单中工作。

关键词:rails;ActiveModel;form_for

中图分类号:TP391.1 文献标识码:A 文章编号:1009-3044(2017)32-0004-01

Tableless Model Applied in form_for of Rails

LIU Hua-yu

(College of Mathematics Science,Luoyang normal university, Luoyang 471934, China)

Abstract: As model, the ActiveModel of rails can be applied to applications that do not require database storage. By Customized, it works well in the form_for.

Key words: rails; ActiveModel; form_for

1 无数据库模型

在rails中,模型(model)一般都和数据库中的某数据表对应,以存储数据。但在某些场合下,模型数据并不需要存储,或者以其他存储形态(如文件)出现,那么这时就需要不用数据库的模型,即无数据库模型。

模型除了用数据库存储数据的功能外,还有数据验证、回调等功能,一般情况下我们还需要用到这些功能的一部分,所以在普通应用意义上的无数据库模型就是把用数据库存储数据的功能从普通意义上的模型中剖离出去。

在rails标准库中,实现这种无数据库模型的方法是用ActiveModel模块,这个模块有很多普通意义的模型所具有的功能,想用哪个功能就把哪个include进去,这样也有利于功能的精简化。

在代码上,普通模型都要继承ActiveRecord::Base,而无数据库模型则什么都不继承,仅仅在类里include所需的模块,如

class sample

include ActiveModel::Model

end

其中ActiveModel::Model能完成很多功能,是最常用的模块。

2 rails中的form_for表单

在rails中,表单有两种,form_tag和form_for,由于form_tag和模型无關,所以此处我们只讨论form_for表单。

如果form_for的第一个参数是一个模型对象,这个对象还属于一个资源的情况下,那么有两种情况:

1) 这个对象是新创建的(即不存在于数据表中)。此时按提交按钮会转向create活动,表达的是增加一个数据

2) 这个对象在数据表中存在。此时按提交按钮会转向update活动,表达的是更新一个已有数据。

3 ActiveModel应用于form_for

由于ActiveModel和数据库无关,所以其模型对象也无法再通过是否存在于数据表中来判断是新数据还是旧数据,也无法得知提交后的活动是创建还是更新。这样就需要一些手段来识别是新数据还是旧数据。

这个手段就是persisted?方法,当模型对象的persisted?为true,代表的是旧数据,如果模型对象的persisted?为false,代表的是新数据。

4 例子

我们以上传文件管理为例。为了管理上传的文件,假设每个文件都对应一个唯一的名字,如果上传了一个同名字的文件,那么代表更新这个文件。由于这个任务和数据库无关,数据以文件形式存储,所以可以用无数据库模型。

1) 定义模型

class Upload

include ActiveModel::Model

attr_accessor :id

def persisted?

id

end

end

这里的id表达的就是文件所对应的名字。

2) 控制器的new活动

def new

@u=Upload.new

end

3) new.html.erb

<%= form_for @u do |f| %>

<%= f.label :id %>

<%= f.text_field :id %>

<%= f.file_field :file %>

<%= f.submit %>

<% end %>

由于@u的id为空,所以@u. persisted?为假,所以这个表单会转向create活动。

4) 控制器的edit活动

def edit

@u=Upload.new

@u.id=params[:id]

end

@u.id被赋值成文件所对应的名字

5) edit.html.erb

由于edit.html.erb的内容和new.html.erb一样,所以就不再重复。

由于在edit活动中@u.id被赋值成文件所对应的名字,所以@u. persisted?为真,所以这个表单会转向update活动。

5 结束语

无数据库模型经过定制,可以很好地和form_for工作方式相匹配,以用于无需数据库的场合。

参考文献:

[1] Jeffrey Allan Hardy. Rails开发者指南[M]. 北京: 机械工业出版社, 2009.

[2] Michael Hartl. Ruby on Rails教程[M]. 北京: 人民邮电出版社, 2017.endprint