Rails ActiveRecord::Migration - writing a textfile contents to the database

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

Answers


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"))

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


IO.read is the correct solution


Need Your Help

How to Bind to TextBox Background color

c# wpf ivalueconverter

I have a text box for user to enter 6 character hex color value, a validator &amp; a converter attached to it. Up to here, everything works fine. But I want to bind a textbox's Background color to ...

C Pointer Location, Decimal and Hexadecimal

c pointers hex decimal

I am trying to learn how to display the pointer value in decimal and hexadecimal. below you can see me create a value and try to use a pointer to print out the value and the values location.

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.