2012-07-01 41 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