2015-12-23 50 views
0

我正在爲移動公司的Rails應用程序工作。我正在努力讓潛在客戶輸入將要提交的數據。有很多非常直接的信息(姓名,電子郵件,電話等),但他們還需要輸入起始地址,郵政編碼,城市,州和國家以及相同的目的地。我希望國家框是一個包含州/省列表的選擇框,但只有在該國是美國或加拿大的情況下。如果該國不是美國或加拿大,該框將消失/他們將無法提交價值。這是可能的軌道,或者這更可能是我會用jQuery的東西?它會在模型​​,控制器還是視圖中實現(它看起來像驗證的模型和框的展示視圖,但我不確定)?在rails模型中有條件需要的字段?

我還是有點新的鐵軌,所以我很抱歉,如果這應該是一個簡單的答案。我爲這個應用程序使用rails 4。

+0

您可以處理與jQuery和ActiveRecord的驗證的組合。對於jQuery,您希望在國家/地區使用監聽器,並根據所選內容顯示/隱藏狀態。在模型中,驗證可以是有條件的。如果國家是美國,它可能需要國家的存在。 –

回答

2

你似乎在正確的軌道上!隱藏/顯示states/provinces框將由jQuery處理。你也可以使用一個ActiveRecord驗證您的模型,以確保state字段爲空,如果國家沒有美國或加拿大:

class MyClass < ActiveRecord::Base 
    validates :state, presence: false, unless: Proc.new { |m| m.country.in?["USA", "Canada"] } 
end 

相反:

validates :state, presence: true, if: Proc.new { |m| m.country.in?["USA", "Canada"] } 

您可以瞭解更多有關自定義驗證在RailsGuides page for Active Record Validations。第5節討論使用自定義方法和特效的條件驗證。第6節談到更強大的定製驗證,但我懷疑你需要在這裏走得更遠。

+0

謝謝!非常有幫助和清晰。 – user3562355

0

要添加到sixty4bit的答案(我upvoted),你應該把你的驗證到Rails的後端,只處理JS的響應。


Convention over configuration要求您儘可能多地使用內置的框架功能;當你開始通過JQuery配置驗證等時,你最終會得到遍佈整個地方的代碼,這往往會導致大量的代碼(重複代碼等)。

Rails的驗證系統非常好 - 您可以通過您的控制器發送任何一組參數,模型將接受/拒絕取決於數據是否符合驗證。

因此,我肯定會建議在您的模型中加入validator;我會做到這一點稍有不同sixty4bit的回答(you can use strings with if/unless):

#app/models/model.rb 
class Model < ActiveRecord::Base 
    validates :state, inclusion: { in: %w(usa canada), 
    message: "%{value} is not a valid state" }, unless: "state.blank?" 
end 

-

它似乎像模型驗證,併爲箱體

的呈現視圖

除了模型驗證(僅針對params),您需要某種前端機制來處理選擇框的空白。

這可以相對簡單地完成:

#app/assets/javascripts/application.js 
$(document).on("change", "select#state", function(e) { 
    if ($(this).val() != "USA") || ($(this).val() != "Canada") { 
     $(this).attr("disabled", true); 
    } 
}); 
+0

感謝您的支持! for'validates:state,inclusion:{in:%w(usa canada)'',這是不是要求'state'字段要麼是「usa」或者「canada」?我不認爲OP希望這些值是狀態,但是如果'country'字段由'usa'填充,'state'字段應該由實際狀態填充(如「California」),或''加拿大「',因此我的驗證正在'國家'的狀態,如果'國家'是''在''這兩個之一' – sixty4bit

+0

是的,這可能是正確的 - 它比我的解釋更有意義。希望該州只能是美國或加拿大 –

相關問題