2012-08-30 59 views
0

讓我們考慮一個實際示例:由客戶編寫的具有許多評論的產品。我們有產品客戶端評論之間的多對多關係。Rails:如何在連接表中創建新條目

class Product < ActiveRecord::Base 
    has_many :reviews 
    has_many :clients, :through => :reviews 
end 

class Client < ActiveRecord::Base 
    has_many :reviews 
    has_many :products, :through => :reviews 
end 

class Reviews < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :client 
end 

在這裏,我使用的has_many :through創造了許多一對多的關係,因爲審查表需要有額外的屬性,如分數,內容,喜歡,...

用戶登錄到我的應用程序,這樣我就可以打通他的數據:

client = Client.find_by_id current_user.id 

他去產品頁面,這樣我就可以得到產品數據:

product = Product.find_by_id params[:id] 

如何創建客戶對產品的評論?

我想:

review = Review.create :client => client, :product => product, :comment => params[:review][:comment] 

,但它給了我:MassAssignSecurity:不能大規模指派保護的屬性:產品,客戶

任何想法?提前致謝。

回答

0

的:客戶端和:產品屬性是私有的,你必須讓他們入店每個班級設置attr_accessible :clientattr_accessible :product分別喜歡:

class Reviews < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :client 

    attr_accessible :client, :product 
end 

希望這有助於

+0

感謝Vilem。在我寫給prasad的時候,即使我在'* Review *'模型中添加'attr_accessible:product,:client',它仍然不起作用。 – htaidirt

+0

我認爲你必須添加attr_accessible到你的類,而不是在模型模型中。 – Vilelm

+0

對不起,我不明白。請問,你能更準確地通過更新你的答案,使用代碼來解釋哪個'attr_accessible:xxx'進入了哪個模型'Xxx'? – htaidirt

1

只要您創建Review對象並明確傳遞參數,就需要在Review模型中使其可訪問。在這種情況下,它必須是外鍵

class Reviews < ActiveRecord::Base 

    belongs_to :product 
    belongs_to :client 

    attr_accessible :client_id, :product_id 
end 

這應該有效,但這是不好的做法,這會導致安全問題。而不是讓外國鍵訪問,並明確地傳遞他們Review.create,我建議用下面的更換review.create:

review = Review.new 
review.client = client 
review.product = product 
review.comment = params[:review][:comment] 
review.save 

這將創建一個新的審查對象,避免大規模分配。 希望這有助於。