2016-04-07 187 views
2

我有一個Rails應用程序,其中包含狀態和城市屬性的用戶模型。
我正在使用寶石來獲取特定州和國家的城市列表。
我希望在註冊時,如果用戶選擇的城市不在用戶選擇的城市列表中,則不允許註冊並顯示錯誤。Rails根據另一個屬性的值驗證模型屬性

 
    validates :state, presence: true, inclusion: { in: CS.states(:in).keys.collect{|x| x.to_s } } 
    validates :city, presence: true, inclusion: { in: CS.cities((:state).to_sym, :in) } 

我在user.rb模型中寫了這段代碼,但它不工作。
:state應該引用用戶提交的'state'屬性的值,但我不認爲它在這裏工作。 我想將用戶給出的狀態值傳遞給函數CS.cities()。 我該如何解決這個問題?

回答

1

您可以使用獲取當前用戶實例的proc或lambda對象。這個實例可以請求狀態。 proc或lambda應該返回所有有效城市的enumerable。

改編自rails v3.2 api

validates :city, presence: true, inclusion: { :in => lambda{ |user| CS.cities(user.state.to_sym, :in) }} 
0

你可以用before_save過濾做到這一點:

:before_save :check_city_state 

def check_city_state 
unless CS.cities((:state).to_sym).include?(self.city) 
    self.errors.add(:city, "select city within the selected state.") 
    return 
end 
end 
相關問題