劉華煜
摘要:rails的ActiveModel作為模型可以應(yīng)用于不需要數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)的場(chǎng)合。經(jīng)過(guò)定制,它可以很好地在form_for表單中工作。
關(guān)鍵詞:rails;ActiveModel;form_for
中圖分類號(hào):TP391.1 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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 無(wú)數(shù)據(jù)庫(kù)模型
在rails中,模型(model)一般都和數(shù)據(jù)庫(kù)中的某數(shù)據(jù)表對(duì)應(yīng),以存儲(chǔ)數(shù)據(jù)。但在某些場(chǎng)合下,模型數(shù)據(jù)并不需要存儲(chǔ),或者以其他存儲(chǔ)形態(tài)(如文件)出現(xiàn),那么這時(shí)就需要不用數(shù)據(jù)庫(kù)的模型,即無(wú)數(shù)據(jù)庫(kù)模型。
模型除了用數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)的功能外,還有數(shù)據(jù)驗(yàn)證、回調(diào)等功能,一般情況下我們還需要用到這些功能的一部分,所以在普通應(yīng)用意義上的無(wú)數(shù)據(jù)庫(kù)模型就是把用數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)的功能從普通意義上的模型中剖離出去。
在rails標(biāo)準(zhǔn)庫(kù)中,實(shí)現(xiàn)這種無(wú)數(shù)據(jù)庫(kù)模型的方法是用ActiveModel模塊,這個(gè)模塊有很多普通意義的模型所具有的功能,想用哪個(gè)功能就把哪個(gè)include進(jìn)去,這樣也有利于功能的精簡(jiǎn)化。
在代碼上,普通模型都要繼承ActiveRecord::Base,而無(wú)數(shù)據(jù)庫(kù)模型則什么都不繼承,僅僅在類里include所需的模塊,如
class sample
include ActiveModel::Model
end
其中ActiveModel::Model能完成很多功能,是最常用的模塊。
2 rails中的form_for表單
在rails中,表單有兩種,form_tag和form_for,由于form_tag和模型無(wú)關(guān),所以此處我們只討論form_for表單。
如果form_for的第一個(gè)參數(shù)是一個(gè)模型對(duì)象,這個(gè)對(duì)象還屬于一個(gè)資源的情況下,那么有兩種情況:
1) 這個(gè)對(duì)象是新創(chuàng)建的(即不存在于數(shù)據(jù)表中)。此時(shí)按提交按鈕會(huì)轉(zhuǎn)向create活動(dòng),表達(dá)的是增加一個(gè)數(shù)據(jù)
2) 這個(gè)對(duì)象在數(shù)據(jù)表中存在。此時(shí)按提交按鈕會(huì)轉(zhuǎn)向update活動(dòng),表達(dá)的是更新一個(gè)已有數(shù)據(jù)。
3 ActiveModel應(yīng)用于form_for
由于ActiveModel和數(shù)據(jù)庫(kù)無(wú)關(guān),所以其模型對(duì)象也無(wú)法再通過(guò)是否存在于數(shù)據(jù)表中來(lái)判斷是新數(shù)據(jù)還是舊數(shù)據(jù),也無(wú)法得知提交后的活動(dòng)是創(chuàng)建還是更新。這樣就需要一些手段來(lái)識(shí)別是新數(shù)據(jù)還是舊數(shù)據(jù)。
這個(gè)手段就是persisted?方法,當(dāng)模型對(duì)象的persisted?為true,代表的是舊數(shù)據(jù),如果模型對(duì)象的persisted?為false,代表的是新數(shù)據(jù)。
4 例子
我們以上傳文件管理為例。為了管理上傳的文件,假設(shè)每個(gè)文件都對(duì)應(yīng)一個(gè)唯一的名字,如果上傳了一個(gè)同名字的文件,那么代表更新這個(gè)文件。由于這個(gè)任務(wù)和數(shù)據(jù)庫(kù)無(wú)關(guān),數(shù)據(jù)以文件形式存儲(chǔ),所以可以用無(wú)數(shù)據(jù)庫(kù)模型。
1) 定義模型
class Upload
include ActiveModel::Model
attr_accessor :id
def persisted?
id
end
end
這里的id表達(dá)的就是文件所對(duì)應(yīng)的名字。
2) 控制器的new活動(dòng)
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?為假,所以這個(gè)表單會(huì)轉(zhuǎn)向create活動(dòng)。
4) 控制器的edit活動(dòng)
def edit
@u=Upload.new
@u.id=params[:id]
end
@u.id被賦值成文件所對(duì)應(yīng)的名字
5) edit.html.erb
由于edit.html.erb的內(nèi)容和new.html.erb一樣,所以就不再重復(fù)。
由于在edit活動(dòng)中@u.id被賦值成文件所對(duì)應(yīng)的名字,所以@u. persisted?為真,所以這個(gè)表單會(huì)轉(zhuǎn)向update活動(dòng)。
5 結(jié)束語(yǔ)
無(wú)數(shù)據(jù)庫(kù)模型經(jīng)過(guò)定制,可以很好地和form_for工作方式相匹配,以用于無(wú)需數(shù)據(jù)庫(kù)的場(chǎng)合。
參考文獻(xiàn):
[1] Jeffrey Allan Hardy. Rails開(kāi)發(fā)者指南[M]. 北京: 機(jī)械工業(yè)出版社, 2009.
[2] Michael Hartl. Ruby on Rails教程[M]. 北京: 人民郵電出版社, 2017.endprint