2013-01-10 96 views
0

我希望我可以在最近升級的Rails 3.2應用程序中獲得一些幫助,Rails 3.2 Mass Assignment

據我所知,在Rails 3.2屬性被默認鎖定下來,爲了讓它們被分配,我需要使用attr_accessible「解鎖」它們。這對正常的模型屬性工作正常。

但是,我有一個自行開發的自定義屬性mixin,允許我爲任何模型添加任意命名的屬性。這些屬性存儲在custom_properties表中。如果我要求模型的屬性如:foo.property_foobar,則此mixin利用缺少的方法查找該表中的屬性。

使用此mixin的每個模型都可以具有任意名稱的X自定義屬性。我無法指定這些屬性的名稱,這些屬性顯然很難添加到attr_accessible中。

有沒有人有關於如何允許這些動態屬性的大規模分配的建議?我寧願不將所有模型屬性列入白名單。

希望所有這些都有道理。感謝大家!

路易

回答

0

一種解決方案是使用attr_protected代替。這允許您在允許其他屬性的同時將某些屬性列入黑名單。但是,這有點難以保證。

另一種解決方案是將分配保護移動到控制器,並根據需要在每個控制器/操作中允許/拒絕屬性。有一個名爲strong parameters的gem允許這個,它也將包含在Rails 4中。我建議這個解決方案。

如果以上都不適合你,也許你應該嘗試另一種方法來實現這些任意屬性?例如,您可以將它們作爲序列化哈希存儲在數據庫列中。

+0

Teoulas,非常感謝您的快速響應! 關於attr_protected,我假設你的意思是關閉白名單。我考慮過這樣做,只是讓我覺得我做錯了,如果我無法獲得白名單工作。我試圖儘可能避免,但考慮到替代品可能無法做到。 我喜歡你關於重新實現我的自定義屬性到ActiveRecord:Store的建議。問題在於我的一些使用我的自定義屬性mixin的模型是分層的:如果子項沒有值,則子項會繼承父項的自定義屬性值(續...) –

+0

...此需求使其變得複雜轉移到ActiveRecord:Store,儘管最終這可能是正確的舉措。 所有這一切,我會絕對看到強大的參數。這聽起來像是一個潛在的解決方案,如果我能夠允許任意命名的屬性。即使這仍然是一個重大的努力。 再次感謝您的時間。非常感謝。我愛RoR的另一個原因! –