Generating multiple files with one ERB template

J

Jacob Lichner

I'm trying to generate html files based on an ERB template with data
pulled from yaml files.

My code looks like this:

listing_data = Dir['../data/*']

listings = []
listing_data.each do |file|
listing = File.open(file) { |data| YAML::load(data) }
listings << Listing.new(listing)
end

listing_template = ERB.new(File.read('listing.rhtml'))

listings.each do |listing|
File.open("../homes/#{listing.file_name}.html", 'w') { |file|
file.write(listing_template.result(binding)) }
end

The problem that I am having is only the first listing is generated
along with an error: "no such file or directory" for the second one.

I have spent a couple of hours looking into it and trying different
things, but I'm just not able to figure it out. I know everything is in
place because the first listing gets generated just fine, but why
doesn't it loop through the rest? If anybody can help me out that would
be amazing.
 
7

7stud --

The problem that I am having is only the first listing is generated
along with an error: "no such file or directory" for the second one.

That couldn't be more vague. Which lines of code are you talking about?

The following works fine for me:

require 'erb'
require 'yaml'

class Listing
attr_reader :file_name, :data

def initialize(arr)
@file_name = arr[0]
@data = arr[1]
end
end

data = ['listingA', 3]
File.open("../data/data1.yaml", "w") {|f| YAML::dump(data, f)}
data = ['listingB', 2]
File.open("../data/data2.yaml", "w") {|f| YAML::dump(data, f)}

data_fnames = Dir["../data/*"]
p data_fnames


listings = []

data_fnames.each do |fname|
yaml_data = File.open(fname) {|f| YAML::load(f)}
listings << Listing.new(yaml_data)
end

p listings

listing_template = ERB.new(File.read('listing.rhtml'))

=begin
#listing.rhtml:

<html>
<head><title></title>
</head>
<body>
<% count.times do |i| %>
<div>info <%= i %></div>
<% end %>
</body>
</html>
=end

listings.each do |listing|
fname = listing.file_name
count = listing.data
File.open("../homes/#{listing.file_name}.html", "w") do |f|
f.write(listing_template.result(binding))
end
end


--output:--
["../data/data1.yaml", "../data/data2.yaml"]

[#<Listing:0x5d4080 @file_name="listingA", @data=3>,
I have spent a couple of hours looking into it and trying different
things


Depending on what's in your template, I think you could have problems
with this part:
listings.each do |listing|
File.open("../homes/#{listing.file_name}.html", 'w') { |file|
file.write(listing_template.result(binding)) }
end

In the future, copy and paste the exact error message--not your
characterization of the error--as well a comment in your code where the
error occurred, e.g.

#<-------ERRROR HERE*****
 
J

Jacob Lichner

thanks for the response and sorry to be so vague!

I was using Dir.chdir in one of my methods in my listing class, which
was the problem.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top