2012-05-13 30 views
24

如果我嘗試執行以下代碼:::加載ActiveModel :: MassAssignmentSecurity錯誤:無法大規模指派保護屬性

hassle = rota.hassles.create(:sender => user1, :receiver => user2, :type => "sms") 

我obain以下錯誤:

Failure/Error: hassle = rota.hassles.create(:sender => user1, :receiver => user2, :type => "sms") 
ActiveModel::MassAssignmentSecurity::Error: 
    Can't mass-assign protected attributes: type 

我不知道這是什麼意思。我已經將類型設爲強制性的,所以如果我刪除它,我會得到一個sql錯誤。

+3

。最好的解決方案是將類型列重命名爲別的東西。一個不推薦的解決方法是添加您的模型文件self.inheritance_column =:some_other_column_that_might_not_exists – bcd

+0

是的 - 看到這個信息繞過使用'類型'列的STI問題:http://stackoverflow.com/questions/7134559/rails-use-type-column-without-sti(儘管更好的選項可能是更改列的名稱)。 –

+0

是的 - 我遇到了這個問題。更改了列名稱。 thnks! – Karan

回答

59

幾件事情:

質量分配通常意味着傳遞屬性成創建一個對象作爲屬性信息的一部分散列呼叫。也就是說,你將一堆散列中的屬性傳遞給創建新對象的調用。例如:

@user = User.create({:name => "My name", :user_type => "nice_user"}) 

然而,Rails包含意味着不是所有的屬性都可以通過默認分配這樣一些基本的安全規則。你必須事先指定哪些可以。你這樣做是這樣的:

class User < ActiveRecord::Base 
    attr_accessible :name, :user_type 
end 

如果不指定屬性爲attr_accessible,而且你通過它來創建對象,你得到你所張貼的錯誤。

以下是詳細信息:

http://api.rubyonrails.org/v3.2.9/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html

另一種方法是設置某些屬性,當你第一次創建記錄,並經過設置其他 - 就像這樣:

# In this example `user_type` is not attr_accessible so it needs to be set specifically 
@user = User.create({:name => "My name"}) 
@user.user_type = "nice_user" 
@user.save 

另外,如果您在使用列名type時遇到問題,因爲rails會感到困惑,並且認爲您想使用單表繼承(STI),請檢查此問題的答案以瞭解如何避開它:http://guides.rubyonrails.org/

+0

謝謝...完美的工作! –

+0

如果您嘗試同時爲多個孩子創建父母,該怎麼辦?例如; 'Post.create(評論)' – tokhi

0

Here是關於Rails中的集體分配的一些信息,以及爲什麼保護在位。當你確實想要分配受保護的屬性時,很容易解決,但需要多行。

hassle = rota.hassles.build(:sender => user1, :receiver => user2) 
hassle.type = 'sms' 
hassle.save 
+0

hassle.type ='sms'最有可能會引發短信班不存在異常 – bcd

+0

也許。我正在假設OP知道他在做STI的事情。 – x1a4

7

您是否正在使用Rails 3.2,同時遵循3.1教程,例如Pragmatic Programmer的「使用Rails進行敏捷Web開發」第4版?然後檢查http://guides.rubyonrails.org/3_2_release_notes.html

您的問題是,從Rails 3.1到3.2默認情況下,Active Record模型的質量分配保護檢查設置爲'strict'。在這些文件中註釋掉相應的行:

config/environments/development.rb 
config/environments/test.rb 

......你很高興繼續學習。記住編碼您的第一個生產應用程序:)

+0

「您是否正在使用Rails 3.2,同時遵循3.1教程,例如Pragmatic Programmer的」使用Rails進行敏捷Web開發「第4版? 這正是我正在做的。 +1修復我的問題。 –

+0

這解決了我的問題,我評論了這一行:'config.active_record.mass_assignment_sanitizer =:strict' – mrzmyr

5
  1. 請儘量在離開這個有效:開放config/application.rb

  2. 找到config.active_record.whitelist_attributes = true

  3. 變更線時真亦假

然後你會好起來的。 PS:記得重新啓動導軌控制檯。

2

您應該會得到另一個錯誤,如下所示:column'type'在繼承時保留用於存儲類。因爲不應在活動記錄數據庫中使用列'類型'。

0

我不使用whitelist_attributes因爲使用情況,當我想允許批量分配是我的內部邏輯,並且通常不直接在控制器中進行CRUD操作。我建議在這些情況下使用強烈的參數。但是,當你要啓用大規模分配的具體型號爲你做

class Foo < ActiveRecord::Base 
    # disables mass-assigment 
    attr_protected 
end 

這基本上設置attr_protected的「類型」欄默認使用的軌道爲STI空數組([])

相關問題