1

Ruby Rails でスケジューリング システムを作成しています。システムは、顧客、リソース、および予約で構成されます。顧客とリソースへの予約には多対 1 があります。顧客とリソースは、多くの予約を持つことができます。

予約にはcustomer_idとbooking_resource_idがあり、保護する必要があると思いました。Resource が activeadmin と競合したため、booking_resource もモデルとして使用しました。

:booking_resource_id ( https://github.com/robinbortlik/validates_overlap )へのスコープで重複する検証を簡単に作成できるようにする validates_overlap gem を使用しています。目標は、同じリソースを同時にスケジュールできないようにすることです。

全体が一括割り当ての下で機能しますが、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
4

1 に答える 1

1

最初に attr_accessible を使用する場合、アクセス可能にしない属性は自動的に保護されるため、attr_protected を使用する必要はありません。

第二に、あなたが を保護する理由がわかりませんbooking_resource_id。つまり、予約するリソースが何であるかをどうやって知ることができますか? はい、編集する場合は保護する必要がありますが、作成する場合はそうは思いません。

したがって、異なる保護属性を指定する必要がある場合は、新しい Rails バージョンに含まれる新しいstrong_parameters gem を確認することをお勧めします。このgemは、コントローラーでホワイトリストに登録する属性を指定する優れた方法を提供し、この場合に必要と思われるコントローラーアクションごとに異なるホワイトリストを作成できます。

于 2012-10-08T01:09:20.497 に答える