2

让我们考虑一个实际的例子:一个有很多评论的产品,由客户撰写。我们通过评论在产品客户之间建立了多对多的关系。

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:无法批量分配受保护的属性:产品、客户

任何想法?提前致谢。

4

3 回答 3

3

一旦您创建了 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

这将创建一个新的 Review 对象,避免批量分配。希望这可以帮助。

于 2012-08-30T15:28:46.193 回答
0

:client 和 :product 属性是私有的,你必须让它们在每个类设置上都可以访问,attr_accessible :client并且attr_accessible :product分别像:

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

    attr_accessible :client, :product
end

希望这可以帮助

于 2012-08-30T13:01:13.460 回答
0

添加到属性为 :product 和 :client 的模型中

attr_accessible :product, :client

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

于 2012-08-30T13:02:11.563 回答