возвращение объектов в рубине - PullRequest
1 голос
/ 02 февраля 2009

Здесь у меня есть приложение для публикации новостей, над которым я работаю в ruby. Создание статьи работает нормально, но я не знаю, как ее найти. Мне бы хотелось, чтобы мой метод Article.get возвращал объект article, но, похоже, единственный способ сделать это - сделать все атрибуты Article доступными для записи, чего я на самом деле не хочу делать. Есть ли лучшие способы сделать это?

require 'date'
require 'ftools'
require 'find'

module News
    class Article
        attr_reader :topic, :body, :created, :directory, :file_name, :file, :author
        attr_writer :topic, :body, :created, :directory, :file_name, :file, :author

        def initialize(author, topic, body)
            @topic = topic
            @body = body
            @author = author
            @created = DateTime.now()
            @directory = 'archive/' + @created.strftime('%Y/%m') + '/'
            @file_name = @created.strftime('%H-%M-%S')
            @file = @directory + @file_name

            File.makedirs(@directory) unless File.directory?(@directory)

            if !File.file?(@file)
                @article = File.new(@file, 'w', 0777)
                @article.print "#{@topic}\n#{@author}\n#{@body}"
                @article.close()
            end
        end

        def Article.get(path)
        #???
        end
    end

Ответы [ 2 ]

3 голосов
/ 02 февраля 2009

Я думаю, что проблема здесь в том, что вы используете метод инициализации для сохранения записи в файловой системе, когда, если вы хотите создать экземпляр объекта article для возврата с

Article.new

тогда это также вызовет метод initialize; возможно, поэтому это сбивает с толку; кажется, вы объединяете две вещи в один метод.

Итак, чтобы упростить его, я бы использовал отдельный persist (сохранить) метод от вашего initialize метода.

Я уверен, что у вас есть веские причины делать это в файловой системе, а не в базе данных, но я не могу не чувствовать, что было бы полезно прочитать о шаблоне активной записи, будь то Ruby реализация этого (если вы решите использовать базу данных) или просто шаблон .

1 голос
/ 02 февраля 2009

Я бы, наверное, сделал два класса, один отвечал за чтение и запись статей на диск (или базы данных или где угодно), а другой - за статьи. Тогда класс хранения, скажем ArticleStorage, будет легко читать с диска и создавать экземпляр Article, который затем можно будет вернуть.

Что-то вроде


class ArticleStorage
  def self.save(article)
    # Make sure the folder is available, and the file is writable
    file.puts(article.to_s)
  end

  def self.load(title)
    # Open the file named title in the right directory
    # Read the file into a hash for example
    return Article.new(file[:author], file[:topic], file[:body], file[:created])
  end
end

class Article
  def initialize(author, topic, body, created)
    # save variables
  end

  def to_s
    # Format and prepare the article for saving
  end
end

Тогда вы можете сделать что-то вроде a = Article.new("author", "my topic", "long text", Time.now) и сохранить его с помощью ArticleStorage.save(a) и загрузить с помощью a = ArticleStorage.load("my topic")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...