2012-07-01 117 views
0

我正在创建一个论坛软件。我想执行关闭主题功能。关闭主题将阻止任何人为封闭主题创建帖子。需要一个策略来“关闭”论坛的主题功能

我当前实现

  • 主题有很多帖子
  • 当创建一个主题,在默认情况下,也是该主题创建的信息。基本上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验证中以某种方式创建的当前主题,我认为这个问题是可以解决的。

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

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

希望这点能指引您朝着正确的方向发展!

+0

这种方式可能工作,如果我能够正确实施它。但是我最终为TOPIC模型创建了一个名为'content'的列。当然不是DRY的做事方式,但它为我节省了很多麻烦。 –

+0

我很高兴你找到了解决方案!你的方法很好,它避免了许多代码,否则你不得不编写代码。 – BK22