Rails - 验证受保护的属性?

时间:2012-10-08 00:35:26

标签: ruby-on-rails ruby

我正在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

1 个答案:

答案 0 :(得分:1)

首先,如果您使用attr_accessible,则不需要使用attr_protected,因为您无法访问的属性将自动受到保护。

其次,我不明白为什么要保护booking_resource_id。我的意思是,你怎么知道要预订的资源是什么?是的,也许是为了编辑它应该受到保护,但是为了创造,我不这么认为。

因此,如果您需要指定不同的受保护属性,我建议您查看将包含在新Rails版本中的新strong_parameters gem。这个gem为你提供了一个很好的方法来指定在控制器中列入白名单的属性,你可以为我认为你需要的每个控制器动作制作不同的白名单。