0

I'm doing something slightly unorthodox here, in that I'm just populating the database via a migration, and using the contents of a textfile. I'm using the following method which doesn't import the entire file, can anyone suggest a solution to this?:

class AddChapters < ActiveRecord::Migration

def self.up

Chapter.create!(:title => "chapter 1",
  :body => File.open("#{Rails.root}/chapters/chapter1.txt").gets)

Chapter.create!(:title => "Chapter 2",
  :body => File.open("#{Rails.root}/chapters/chapter2.txt").gets)

Chapter.create!(:title => "Chapter 3",
  :body => File.open("#{Rails.root}/chapters/chapter3.txt").gets)

end

def self.down Chapter.all.each do |chapter| chapter.delete end end end

lbz
  • 9,560
  • 2
  • 30
  • 35
Paul Nelligan
  • 2,015
  • 2
  • 18
  • 18

3 Answers3

0

Try using the class method IO.read instead. IO.gets only reads until the first separator (usually newline).

harald
  • 5,976
  • 1
  • 24
  • 41
  • 1
    That said, you should probably use the `db/seeds.rb` file for this instead of a migration. – harald Nov 30 '10 at 22:54
0

There could be a number of problems at work here.

The first one is to check that the body field in your table has sufficient length to hold the contents of the text files.

Also, gets might not be what you're after. From the RDoc:

Reads the next ``line’’ from the I/O stream; lines are separated by sep_string. A separator of nil reads the entire contents, and a zero-length separator reads the input a paragraph at a time (two successive newlines in the input separate paragraphs). The stream must be opened for reading or an IOError will be raised. The line read in will be returned and also assigned to $_. Returns nil if called at end of file.

What you probably want is IO.read here to guarantee you get all the file, since it can take a path to a file by default, you don't need to use File at all here:

Chapter.create!(:title => "chapter 1",
  :body => IO.read("#{Rails.root}/chapters/chapter1.txt"))

Chapter.create!(:title => "Chapter 2",
  :body => IO.read("#{Rails.root}/chapters/chapter2.txt"))

Chapter.create!(:title => "Chapter 3",
  :body => IO.read("#{Rails.root}/chapters/chapter3.txt"))
hhry
  • 16
  • 1
  • Much thanks all, IO.read did the trick ... The reason I'm using .txt and not seeds/fixtures is because the user wants to edit a .txt file when they're writing, and not a ruby file. – Paul Nelligan Dec 01 '10 at 09:12
0

IO.read is the correct solution

Paul Nelligan
  • 2,015
  • 2
  • 18
  • 18