2016-04-07 15 views
2

州と都市の属性を持つUserモデルを持つレールアプリがあります。
私は、特定の州と国の都市のリストを取得するために宝石を使用しています。
ユーザが選択した都市がユーザによって選択された州の都市リストにない場合に申し込みをしていますが、申し込みを許可せずにエラーを表示します。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はすべての有効な都市で列挙型を返すべきです。

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 
関連する問題