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 : can't mass-assign protected attributes: product, client

何か案が?前もって感謝します。

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

これにより、一括割り当てを回避する新しいレビューオブジェクトが作成されます。お役に立てれば。

于 2012-08-30T15:28:46.193 に答える
0

属性が :product および :client である ur モデルに追加します

attr_accessible :product, :client

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

于 2012-08-30T13:02:11.563 に答える
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 に答える