2012-07-01 3 views
0

Я создаю форумное программное обеспечение. Я хочу реализовать закрытие тема функциональность. Закрытие темы не позволит кому-либо создавать сообщения для закрытой темы.Нужна стратегия «закрыть» тему для форума

Моей текущей реализация

  • ТЕМА имеет много сообщений
  • Когда ТЕМА создается, по умолчанию, POST также созданное для этой темы. В основном, 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 

Проблема

Этот способ отлично работает на тему, которая становится закрыто через некоторое время после его создания. Однако, когда я создаю новую тему, это становится проблематичным.

Поскольку в проверке 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

Вы можете попробовать что-то вроде обратного вызова 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

Этот способ, вероятно, сработал, если я смог его правильно реализовать. Но я закончил создание столбца под названием content для модели TOPIC. Конечно, не сухим способом делать что-то, но это спасло меня от хлопот. –

+0

Я рад, что вы нашли решение! Ваш метод в порядке, и он избегает большого количества кода, который вам в противном случае пришлось бы написать. – BK22

Смежные вопросы