我正在创建一个论坛软件。我想实现关闭主题功能。关闭主题将阻止任何人为已关闭的主题创建帖子。
我目前的实施
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,它在创建后的某个时间关闭。但是,当我创建一个新的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验证中以某种方式创建的当前主题,我认为这个问题可以解决。
我该怎么做?或者你们有其他方法来解决这个问题吗?
答案 0 :(得分:0)
您可以在Topic模型中尝试类似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
方法以确保可以创建初始帖子。
希望这能指出你正确的方向!