我使用的是動態attr_accessible
按這篇文章:mass_assignment_authorizer和嵌套屬性
http://asciicasts.com/episodes/237-dynamic-attr-accessible
它工作正常。但是我還沒有找到一種使嵌套屬性工作的優雅方式。這裏有一些簡化的代碼:
class Company < ActiveRecord::Base
has_many :employees
accepts_nested_attributes_for :employees
end
class Employee < ActiveRecord::Base
belongs_to :company
attr_protected :salary
attr_accessor :accessible
def mass_assignment_authorizer
if accessible == :all
ActiveModel::MassAssignmentSecurity::BlackList.new
else
super + (accessible || [])
end
end
end
比方說,我有一個管理界面與公司的RESTful形式。在此表格中,我有employees_attributes
的字段,其中包括用於創建新員工的空白字段。在這種情況下,我無法找到一種方法來呼叫Employee#accessible=
。通過ActiveRecord的源代碼瀏覽,看來,這可能是不可能的:在一個非常深的調用堆棧上最遙遠的,嵌套協會只是導致Employee.new
被調用的屬性。
我還以爲有關創建可以通過質量分配傳遞一個特殊的屬性。如果屬性的值是正確的代碼,員工實例將設置@accessible
到:all
。但我不認爲有一種方法可以保證在受保護屬性之前設置此屬性。
有沒有什麼辦法,使動態保護的屬性與嵌套屬性的工作嗎?
是的,你必須employees_attributes添加到您的訪問屬性列表。但真正的問題是在員工對象本身設置「可訪問」屬性。請注意,只有當您使用* dynamic *可訪問屬性時,這纔是相關的,如問題開頭引用的文章所述。 – rlkw1024 2012-11-08 22:23:56