我正在创建一个论坛软件。我想执行关闭主题功能。关闭主题将阻止任何人为封闭主题创建帖子。需要一个策略来“关闭”论坛的主题功能
我当前实现
- 主题有很多帖子
- 当创建一个主题,在默认情况下,也是该主题创建的信息。基本上TOPIC有一个
title
,并从POST的content
派生内容主体。
class AddClosedToTopic < ActiveRecord::Migration
def change
add_column :topics, :closed, :boolean, default: false
end
end
- 主题有一个名为
closed
列。如果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
问题
这样工作完全正常的一个主题,就是它的创建后变为闭合一段时间。但是,当我创建一个新的TOPIC时,它会变得有问题。
由于在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验证中以某种方式创建的当前主题,我认为这个问题是可以解决的。
我该怎么做?或者你们有其他方法来解决这个问题吗?
为什么不在帖子后面保存主题? –