2012-07-11 49 views
3

我有Project型號和User型號。一個項目必須有一個客戶端(用戶類),所以Project模型有一個client_id外鍵。Rails Model驗證以檢查屬性的值

User型號具有type屬性,如果用戶是客戶端,將包含3

我想驗證項目分配給客戶端時,@user.type3

Project.rb

validates :client_id, presence: true, #@user.type must be 3 
belongs_to :client, :class_name => User, :foreign_key => :client_id 

User.rb

#constants 
TYPES = { 
    :manager => 1, 
    :contractor => 2, 
    :client => 3 
} 

不要知道如何去驗證。我通過了有關驗證的導軌指南,但仍然無法獲得解決方案。有任何想法嗎?

回答

5

使用inclusion驗證幫助程序。 Docs here

下面是從文檔

class Coffee < ActiveRecord::Base 
    validates :size, :inclusion => { :in => %w(small medium large), 
    :message => "%{value} is not a valid size" } 
end 


編輯一個簡單的例子:

好吧,我明白你的意思。不要爲此使用驗證助手,請手動完成。

# somewhere in your model (don't be tempted to put this in your controller) 
def assigning_client 
    if @user.type == 3 
    # do the assignment 
    else 
    errors.add(:base, :message => "User must be a client") 
    end 
end 

錯誤將阻止只要您使用砰版本save!這迫使驗證被保存的信息。

+0

是否可以使用'inclusion'助手來說「只有那些用戶ID 'type'是'3'嗎?我一直在嘗試,但是不能讓它工作。 – 2012-07-11 03:36:43

+0

'validates:user_type,:inclusion => {:in => [3]}' – Dty 2012-07-11 06:04:17

+0

不,不,也許對不起我不清楚,這是保存用戶ID,但是正在保存ID的用戶必須具有'3'作爲他們的'type'屬性。 – 2012-07-11 16:05:04

1

只是一個指針在這裏。請勿在activerecord模型中使用名爲type的屬性。它與rails使用STI(單表繼承)的方式相沖突,因爲它使用type屬性來確定類的類型,當它的子類另一個

+0

完美,謝謝! – 2012-07-11 03:13:23