• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    無(wú)數(shù)據(jù)庫(kù)模型在rails的form_for表單中的應(yīng)用

    2017-12-15 18:26:31劉華煜
    電腦知識(shí)與技術(shù) 2017年32期

    劉華煜

    摘要: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

    南投县| 鄂尔多斯市| 西吉县| 佛山市| 石棉县| 永吉县| 英超| 精河县| 侯马市| 宝应县| 淮阳县| 吴川市| 安新县| 潮州市| 合作市| 岫岩| 西盟| 南华县| 阿拉善右旗| 沙洋县| 沁源县| 灵丘县| 大埔区| 卓尼县| 永清县| 安吉县| 巩留县| 重庆市| 江阴市| 远安县| 岐山县| 扶绥县| 澜沧| 赞皇县| 大荔县| 中牟县| 南平市| 吉安县| 元氏县| 澜沧| 特克斯县|