我正在Ruby Rails中创建一个调度系统。该系统由客户,资源和预订组成。预订客户和资源有很多对一个。客户和资源可以有很多预订。
预订有customer_id和booking_resource_id我认为应该受到保护。我还使用了booking_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/,但我似乎有点走投无路。如果我使用attributes =并覆盖质量分配保护的重点是什么?
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 :(得分:1)
首先,如果您使用attr_accessible,则不需要使用attr_protected,因为您无法访问的属性将自动受到保护。
其次,我不明白为什么要保护booking_resource_id
。我的意思是,你怎么知道要预订的资源是什么?是的,也许是为了编辑它应该受到保护,但是为了创造,我不这么认为。
因此,如果您需要指定不同的受保护属性,我建议您查看将包含在新Rails版本中的新strong_parameters gem。这个gem为你提供了一个很好的方法来指定在控制器中列入白名单的属性,你可以为我认为你需要的每个控制器动作制作不同的白名单。