需要一种策略来“关闭”论坛的主题功能

时间:2012-07-01 20:08:41

标签: ruby-on-rails

我正在创建一个论坛软件。我想实现关闭主题功能。关闭主题将阻止任何人为已关闭的主题创建帖子。

我目前的实施

  • TOPIC有很多帖子
  • 创建TOPIC时,默认情况下还会为该主题创建一个POST。基本上TOPIC有一个title,并从POST的content中获取内容。
class AddClosedToTopic < ActiveRecord::Migration
  def change
    add_column :topics, :closed, :boolean, default: false
  end
end
  • TOPIC有一个名为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验证中以某种方式创建的当前主题,我认为这个问题可以解决。

我该怎么做?或者你们有其他方法来解决这个问题吗?

1 个答案:

答案 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方法以确保可以创建初始帖子。

希望这能指出你正确的方向!