0

シード.rb のほとんどのエントリは、次のように単純です。

User.create!(
name: "Peter"
admin: false;
# etc.
)

「保護された属性を一括割り当てできません」というエラーが表示された場合は、モデルに小さな変更を加えます。この場合は user.rb です。

attr_accessible: name, admin

ここまでは順調ですね。しかし、別のエンジンをアプリに追加する rails gem によって生成されたテーブルにエントリをシードするにはどうすればよいでしょうか? たとえば、フォア。そして、私は他にもいると確信しています。

これらのエントリをseeds.rbファイルに追加しました:

Forem::Category.create!(
name: "cat1"
)

Forem::Forum.create!(
title: "forum1",
description: "forum1 description",
category_id: 1
)

Forem::Topic.create!(
forum_id: 1,
user_id: 1,
subject: 'topic1',
locked: false,
pinned: false,
hidden: false,
)

カテゴリとフォーラムは生成されますが、トピックはありません:

Can't mass-assign protected attributes: forum_id, user_id, locked, pinned, hidden

topic.rb モデルがあれば、何をすべきかがわかります。しかし、私はそれを持っていません。Forem はエンジンであり、モデル topic.rb の一部の属性を表示する方法がわかりません。

application.rb の次の行を知っています。

config.active_record.whitelist_attributes = true

大量割り当てに対する保護を有効にします。これを無効にすると、大きなセキュリティ ホールが残るため、オプションではありません。とにかく無効にすると、トピックテーブルにシードできませんでした。

備品も使ってみました。これをseeds.rbファイルに追加しました:

require 'active_record/fixtures'
Fixtures.create_fixtures("#{Rails.root}/test/fixtures", "topics.yml")

テスト/topics.yml:

one:
  id: 1
  forum_id: 1
  user_id: 1
  subject: "topic1"
  created_at: 2012-05-19 19:54:19
  updated_at: 2012-05-19 19:54:20
  locked: false
  pinned: false
  hidden: false
  last_post_at: 2012-05-19 19:54:21
  state: "open"
  views_count: 3

私が得るエラーは -初期化されていない定数フィクスチャです

私の Seeds.rb とフィクスチャの何が問題になっていますか? または、移行を使用する必要がありますか?

4

2 に答える 2

2

無効にすると巨大なセキュリティ ホールが残るため、オプションではありません`

いいえ、それは巨大なセキュリティ ホールではありません。これは物議を醸す議論ですが、attr_accessible(私と他の多くの人の意見では) (およびバリアント) は、ユーザーがすべきでないオブジェクト/属性を作成/更新することを妨げている問題に対する良い解決策ではありません。別の言い方attr_accessibleをすれば、コントローラーの問題に対するモデル ソリューションです。これは、データがクリーンアップされて使用可能であることを確認したり、現在のユーザーがそのようなことを許可されているかどうかを確認したりするのがコントローラーの仕事であるためです。

したがって、私がすることは、へのすべての参照を削除して falseattr_accessibleに設定することです。whitelist_attributes

次に、コントローラーでパラメーターをフィルター処理するのはあなた次第です。この要点で行ったように行うか、 rails/strong_parametersを使用するか、その他の方法を使用してください。

その後、シード中にこれらの問題は発生しなくなります

于 2012-05-24T17:31:09.440 に答える
1

Seeds.rb は単なる Ruby コードです。リソース全体を 1 行で作成する必要はありません。このようなことを試してください

topic = Forem::Topic.create(
  :subject => "topic 1",
  :locked => false
  # etc
)

topic.user_id = 1
topic.save
于 2012-05-24T17:28:41.087 に答える