0

フォーラムソフトウェアを作成しています。トピックを閉じる機能を実装したい。トピックを閉じると、閉じたトピックの投稿を作成できなくなります。

私の現在の実装

  • TOPICにはたくさんの投稿があります
  • TOPICが作成されると、デフォルトでは、そのTOPICに対してPOSTも作成されます。基本的に、TOPICには、titlePOSTのコンテンツの本体がありますcontent
class AddClosedToTopic < ActiveRecord::Migration
  def change
    add_column :topics, :closed, :boolean, default: false
  end
end
  • TOPICには。という列がありますclosed。trueの場合closed、トピックは閉じられます。デフォルトでは、falseに設定されています。
  • ユーザーが投稿を作成しようとするたびに、以下の検証を使用して、トピックが閉じられているかどうかを確認します。
class Post < ActiveRecord::Base
  . . .
  validate :cannot_create_replies_to_closed_topic

  # custom validation methods
  def cannot_create_replies_to_closed_topic
    topic = Topic.find_by_id(topic_id)
    if topic.closed?
      errors.add(:content, "can't be created for a topic that is closed")
    end
  end
end

問題

この方法は、作成後に閉じられるトピックに対しては完全に正常に機能します。ただし、新しいトピックを作成すると問題が発生します。

POST検証ではtopic = Topic.find_by_id(topic_id)、現在作成中の新しいトピックはデータベースに含まれません。したがって、NoMethodErrorをスローします。

NoMethodError in TopicsController#create
undefined method `closed?' for nil:NilClass

app/models/post.rb:16:in `cannot_create_replies_to_closed_topic'
app/controllers/topics_controller.rb:21:in `create'

考えられる解決策は?

POST検証で作成されている現在のトピックを参照できる方法があると思いますが、この問題は解決できると思います。

これどうやってするの?それとも、この問題を解決する他の方法がありますか?

4

1 に答える 1

0

トピックモデルでコールバックのようなものを試してafter_create、トピックが作成された後にのみ投稿を作成し、そのメソッドでtopic_idを設定することができます。

このようなもの:

 after_create :create_initial_post

 def create_initial_post
   post = Post.new(:topic_id => self.id)
   post.save
 end

これで問題が解決するはずです。コードの一部を変更して、最初にトピックが作成され、その後に最初の投稿が作成されるようにする必要がある場合があります。メソッドを変更してcannot_create_replies_to_closed_topic、最初の投稿を確実に作成できるようにすることもできます。

これがあなたを正しい方向に向けることを願っています!

于 2012-07-01T20:29:59.113 に答える