フォーラムソフトウェアを作成しています。トピックを閉じる機能を実装したい。トピックを閉じると、閉じたトピックの投稿を作成できなくなります。
私の現在の実装
- TOPICにはたくさんの投稿があります
- TOPICが作成されると、デフォルトでは、そのTOPICに対してPOSTも作成されます。基本的に、TOPICには、
title
POSTのコンテンツの本体があります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検証で作成されている現在のトピックを参照できる方法があると思いますが、この問題は解決できると思います。
これどうやってするの?それとも、この問題を解決する他の方法がありますか?