1

Rails3をmongoid2で使用しています。embeds_manyトピックを含むmongoidクラスフォーラムがあります。トピックembeds_manyフォーラム投稿

コントローラで次のことを行ってフォーラム投稿を保存しようとすると...

@forum = Forum.find(params[:forum_id])
@forum.topics.find(params[:topic_id]).forumposts.build(:topic_id => params[:forumpost][:topic_id], :content => params[:forumpost][:content], :user_id => current_user.id,:posted_at => Time.now, :created_at => Time.now, :updated_at => Time.now)
if @forum.save

保存すると...

2012-11-14 23:15:39 UTC:Timeの未定義のメソッド `each'

なぜそのエラーが発生するのですか?

私のフォーラムポストクラスは次のとおりです...

class Forumpost
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::Paranoia

  field :content, type: String
  field :topic_id, type: String
  field :user_id, type: String
  field :posted_at, type: DateTime

    attr_accessible :content, :topic_id, :user_id, :posted_at, :created_at, :updated_at

  validates :content, presence: true
  validates :topic_id, presence: true
  validates :user_id, presence: true

    belongs_to :topic
    belongs_to :user

end
4

1 に答える 1

7

あなたのサンプルコードには多くの間違い/奇妙なことがあるので、最初から始めることができるかどうか見てみましょう:

フォーラムには多くのトピックが埋め込まれており、フォーラムには多くの投稿が埋め込まれています。しかし、あなたのモデルは belongs_to 関連付けを使用しています。Belongs_to は、埋め込みドキュメントとは異なる参照に使用されます。Topic モデルにこれがある場合:

class Topic
  ...
  embeds_many :forumposts
  ...
end

次に、Forumpost モデルには次のものが必要です。

class Forumpost
  ...
  embedded_in :topic
  ...
end

参照と埋め込みドキュメントについては、こちらをご覧ください: http://mongoid.org/en/mongoid/docs/relations.html

次のポイント、:topic_id をフォーラムポストに入れる必要はありません。これは、トピックから構築しているためです。

次のポイントは、フォーラムを保存するのではなく、フォーラムの投稿を保存することです。そして、ビルド後に保存する代わりに、一度に作成してみてください。

次に、user_id => current_user.id を設定する代わりに、user => current_user を設定してみてください。これは、belongs_to アソシエーションが提供する魔法です... よりクリーンで、ID のいじりを回避します。

次のポイント、なぜ created_at (Mongoid::Timestamps によって提供される) と posted_at の両方が必要なのですか?

最後に、タイムスタンプを設定する必要はありません。作成/更新時に自動的に設定する必要があります (何らかの理由で実際に posted_at が必要な場合を除きます)。

このようなことをもっと試してください:

@forum = Forum.find(params[:forum_id])
@topic = @forum.topics.find(params[:topic_id])
if @topic.forumposts.create(:content => params[:forumpost][:content], :user => current_user)
  #handle the success case
else
  #handle the error case
end   
于 2012-11-15T02:14:04.000 に答える