2012-10-08 109 views
1

我正在Ruby Rails中創建一個調度系統。該系統由客戶,資源和預訂組成。預訂客戶和資源有很多不同之處。客戶和資源可以有很多預訂。Rails - 已驗證的受保護屬性?

預訂了customer_id和booking_resource_id我認爲應該受到保護。我還使用booking_resource作爲模型,因爲Resource與activeadmin衝突。

我正在使用validates_overlap gem,它允許輕鬆地創建一個與範圍重疊驗證:booking_resource_id(https://github.com/robinbortlik/validates_overlap)。目標是我們永遠不能同時安排同一資源。

整個事情在批量分配下工作,但只要我將booking_resource_id設置爲受保護狀態,就可以在控制器中添加各個分配,並通過驗證。

如何驗證受保護的屬性?

我讀http://www.davidverhasselt.com/2011/06/28/5-ways-to-set-attributes-in-activerecord/但我似乎有點走投無路。如果我使用屬性=和覆蓋質量分配保護點是什麼?

class Booking < ActiveRecord::Base 
    belongs_to :customer 
    belongs_to :booking_resource 
    attr_accessible :approved, :approvedBy, :end, :start, :title 
    attr_protected :customer_id, :booking_resource_id 
    validate :start_cannot_be_future 
    validates :start, :end, :overlap => {:scope => :booking_resource_id} 

    def start_cannot_be_future 
    if self.start > self.end 
     errors.add(:start, "Date can't be in the future") 
    end 
    end 
end 
+0

我可以在這裏偷步......看樣子設置@ booking.customer_id =參數[:預訂] [:CUSTOMER_ID]不驗證,我沒有看到它,因爲我沒有正確的重定向失敗的控制器,剛剛設置爲重定向回到索引。 –

回答

1

首先,如果你使用attr_accessible那麼你並不需要使用attr_protected因爲屬性你不訪問將自動受到保護。

其次我不明白你爲什麼保護booking_resource_id。我的意思是,你怎麼知道預定的資源是什麼?是的,也許編輯它應該受到保護,但對於創建我不這麼認爲。

因此,如果您需要指定不同的受保護屬性,我建議您查看將包含在新Rails版本中的新strong_parameters gem。這種寶石爲您提供了一個很好的方式來指定至極attribues控制器列入白名單,你可以爲每個控制器動作至極我想你在這種情況下需要不同的白名單。

相關問題