2012-08-03 19 views
18

我聽說過幾個人抱怨並在Rails中發佈關於大規模任務的問題。我有幾次同樣的錯誤,我所做的只是attr_accessible。但是什麼是大規模任務?有人可以用例子來解釋嗎?什麼是Rails中的大規模任務3

+1

看看這個:http://railscasts.com/episodes/26-hackers-love-mass-assignment。雖然它可能有點過時,但核心原則仍然是一樣的。 – 2012-08-03 18:26:13

+0

注意:** Rails 4 **在控制器中使用[** strong parameters **](http://weblog.rubyonrails.org/2012/3/21/strong-parameters/)更好地處理質量分配,而不是保護在模型中。請參閱[**本文**](http://net.tutsplus.com/tutorials/ruby/mass-assignment-rails-and-you/),瞭解什麼是集體分配和Rails 3/4技術。 – Yarin 2013-09-11 17:31:20

回答

34

Mass Assignment是Rails用參數散列構造對象的行爲。這是「質量分配」,因爲您正在通過一個賦值運算符爲屬性分配多個值。

下面的代碼片段進行nametopic屬性Post模型的質量分配:

Post.new(:name => "John", :topic => "Something") 
Post.create(:name => "John", :topic => "Something") 
Post.update_attributes(:name => "John", :topic => "Something") 

爲了這個工作,你的模型必須允許質量分配在你的哈希每個屬性有傳入

的兩種情況下,這將失敗:

  • 您有attr_accessible聲明這確實包括:name
  • 你有一個attr_protected確實包括:name

它最近成爲該屬性必須手動白名單通過attr_accessible爲了質量分配默認成功。在此之前,默認是爲屬性的可分配除非他們明確地列入黑名單attr_protectedattr_acessible.

重要的是要考慮哪些屬性可以大量分配,因爲這樣的代碼是很重要的任何其他屬性被白名單這是如此普遍:

@post = Post.new(params[:post]) 

典型地,當用戶提交由form_for @post呈現的形式,這是使用。在理想的世界中,params[:post]散列應該只包含我們在表單上顯示的字段。但是,用戶在他們的請求中傳遞額外的字段很容易,所以實際上您允許用戶在@post上設置任意字段,而不僅僅是表單上顯示的字段。

未能安全地使用批量分配導致了一些很大的Rails應用程序中的幾個高配置錯誤,例如允許某人將inject their own public key放入Github存儲庫中的可信密鑰列表並將代碼直接推送到存儲庫中應該沒有訪問權限。