淺析ROR項(xiàng)目中的validate

表單的驗(yàn)證在ROR項(xiàng)目里是非常必要的手段,常規(guī)的表單驗(yàn)證有以下幾種方式:
1.model層面的validate;
2.controller層面的validate;
3.view層面使用js進(jìn)行validate;

上述幾種方式,筆者在實(shí)際工作中都有使用,下面分析一下這幾種方式的實(shí)現(xiàn)思路以及優(yōu)劣。

1.model層面:這是比較推薦的一種方式,符合MVC框架的要求,將驗(yàn)證的工作交給model,驗(yàn)證代碼的復(fù)用性會(huì)非常高,也最為可靠(這是相對(duì)前臺(tái)JS驗(yàn)證來說,因?yàn)镴S驗(yàn)證可能因?yàn)闉g覽器對(duì)JS代碼兼容性的問題或者禁用JS導(dǎo)致驗(yàn)證失敗)。model層面除了默認(rèn)提供的驗(yàn)證字段的非空、類型、不重復(fù)之外,還可以支持代碼塊或者獨(dú)立的action,比如某個(gè)字段是用于存儲(chǔ)另一張表的多個(gè)id,中間使用英文的逗號(hào)隔開。那在寫入這個(gè)字段的時(shí)候,需要驗(yàn)證用戶手填的id的合法性。此時(shí)在model中可以這樣實(shí)現(xiàn):

validate :validate_user_id
def validate_attention_people
errors.add(:user_ids, "用戶id輸入錯(cuò)誤") if xxx
end
errors是當(dāng)前實(shí)例化對(duì)象的一個(gè)屬性,可以使用errors.add()方法來增加報(bào)錯(cuò)信息,這個(gè)方法支持兩個(gè)參數(shù),第一個(gè)是返回錯(cuò)誤時(shí),作用在那個(gè)字段對(duì)應(yīng)的輸入框。第二個(gè)參數(shù)就是報(bào)錯(cuò)的提示語。當(dāng)errors的內(nèi)容不為空時(shí),驗(yàn)證就不會(huì)被通過,數(shù)據(jù)不會(huì)被保存。

2.controller層面:一般不推薦在controller層面去驗(yàn)證然后返回錯(cuò)誤信息,一方面不符合MVC的原則,代碼的復(fù)用性也會(huì)比較低(因?yàn)閷?duì)于同一個(gè)字段的驗(yàn)證,每個(gè)需要驗(yàn)證的action都需要寫一遍)。如果的確需要用到,一般是這樣實(shí)現(xiàn)的:

render :text => "<script>alert('用戶id輸入有誤');history.back();</script>" and return if xxx
思路是直接調(diào)用js的history.back()強(qiáng)行返回到表單提交的頁面,然后彈出一個(gè)JS彈框描述報(bào)錯(cuò)的內(nèi)容。

3.view層面:視圖層面的JS驗(yàn)證雖然不完全符合MVC的要求,但可以提供給用戶較為舒適的用戶體驗(yàn),實(shí)時(shí)反饋給用戶報(bào)錯(cuò)信息,而不需要不斷的刷新頁面后再返回。常見的方式是驗(yàn)證一些非空、字段類型、想要注冊(cè)的用戶名是否已占用等。其中前兩個(gè)比較簡單,直接可以在前臺(tái)驗(yàn)證。最后一個(gè)顯然需要使用ajax等方式進(jìn)行js提交去后臺(tái)驗(yàn)證,獲得結(jié)果后進(jìn)行判斷是否通過或者是阻止表單的提交。想要實(shí)現(xiàn)這個(gè)過程,需要對(duì)ROR的action,路由,jquery比較熟悉,從而完成一整套從前臺(tái)到后臺(tái),再返回前臺(tái)過程。實(shí)現(xiàn)的方式如下:

$(".btn-save-purchase-application").click ->
if $("#ams_purchase_application_attention_people").val() != ''
attention_people_username_string = $("#ams_purchase_application_attention_people").val()
$.ajax(
url: '/ams/purchase_applications/check_attention_people',
dataType: 'json',
type: 'put',
data: {"attention_people_username_string": attention_people_username_string},
success: (data, textStatus) ->
if textStatus == 'success'
if data.length == 0
$("#ams_purchase_application_form").submit()
return false
else
alert('以下關(guān)注人用戶名輸入錯(cuò)誤:' + data.join(";"))
return false
else
alert '發(fā)生錯(cuò)誤,請(qǐng)聯(lián)系公司IT!'
return false
)
return false
此時(shí)后臺(tái)的action就比較簡單了:
def check_attention_people
render :json => User.check_username(params[:attention_people_username_string]).to_json
end
前臺(tái)使用ajax進(jìn)行一次提交,期待返回一個(gè)json類型的數(shù)據(jù),后臺(tái)接受到請(qǐng)求后,對(duì)數(shù)據(jù)進(jìn)行查詢,然后返回一個(gè)json格式的數(shù)據(jù),前臺(tái)再通過success的回調(diào),判斷是否驗(yàn)證通過或者阻止表單提過。

上述三種方式就是ROR項(xiàng)目中比較常見的驗(yàn)證方式,希望上述內(nèi)容能給各位讀者一些幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • HTML表單 在HTML中,表單是 ... 之間元素的集合,它們?cè)试S訪問者輸入文本、選擇選項(xiàng)、操作對(duì)象等等,然后將...
    蘭山小亭閱讀 3,443評(píng)論 2 14
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,973評(píng)論 19 139
  • Struts數(shù)據(jù)效驗(yàn) 表單數(shù)據(jù)的驗(yàn)證:前臺(tái)驗(yàn)證:主要是通過JS驗(yàn)證, 表達(dá)數(shù)據(jù)是否合法!后臺(tái)驗(yàn)證:通過后臺(tái)java...
    奮斗的老王閱讀 932評(píng)論 0 51
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,466評(píng)論 25 708
  • 早早的,我踏入了社會(huì)這個(gè)大學(xué)校。帶著所有的美好,天真和無限的憧憬。然而最后都敗給了社會(huì)。 起初,我是一...
    灌心姐姐閱讀 345評(píng)論 0 0