0

I'm working through an ERB chapter from a Lynda.com course, Ruby Essential Training Part 3: Files, Formats, Templates, and keep getting a syntax error in what appears to be ERB itself. When I enter this code:

#!/usr/bin/env ruby

#### Mail Merge ####
#
# Launch this Ruby file from the command line
# to get started
#

require 'erb'
require 'csv'

APP_ROOT = File.expand_path(File.dirname(__FILE__))

# files in current dir
template_path = File.join(APP_ROOT, 'letter_template.txt')
csv_path = File.join(APP_ROOT, 'us_presidents.csv')

template = File.read(template_path)

i = 0
CSV.foreach(csv_path) do |row|
  next if row[0].start_with?('Number') # Header row
  i += 1

  @last_name = row[1]
  @first_name = row[2]
  state = row[6]
  end_date = row[4] || Time.now.year

  @title = "The History of #{state}"
  @due_date = end_date
  years = Time.now.year - @due_date.to_i
  @fee = "$#{years * 365}.00"

  letter = ERB.new(template).result(binding)

  num = i < 10 ? "0#{i}" : i
  filename = "letter_#{num}.txt"
  filepath = File.join('letters', filename)

  puts "-------"
  puts filepath
  puts letter

  File.write(filepath, letter)

end

I get this error message:

Traceback (most recent call last):
    15: from init.rb:20:in `<main>'
    14: from /Users/andrekibbe/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/csv.rb:510:in `foreach'
    13: from /Users/andrekibbe/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/csv.rb:658:in `open'
    12: from /Users/andrekibbe/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/csv.rb:511:in `block in foreach'
    11: from /Users/andrekibbe/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/csv.rb:1280:in `each'
    10: from /Users/andrekibbe/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/csv.rb:1280:in `each'
     9: from /Users/andrekibbe/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/csv/parser.rb:336:in `parse'
     8: from /Users/andrekibbe/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/csv/parser.rb:823:in `parse_quotable_loose'
     7: from /Users/andrekibbe/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/csv/parser.rb:49:in `each_line'
     6: from /Users/andrekibbe/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/csv/parser.rb:49:in `each_line'
     5: from /Users/andrekibbe/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/csv/parser.rb:52:in `block in each_line'
     4: from /Users/andrekibbe/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/csv/parser.rb:871:in `block in parse_quotable_loose'
     3: from /Users/andrekibbe/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/csv/parser.rb:1122:in `emit_row'
     2: from init.rb:34:in `block in <main>'
     1: from /Users/andrekibbe/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/erb.rb:905:in `result'
/Users/andrekibbe/.rvm/rubies/ruby-2.7.0/lib/ruby/2.7.0/erb.rb:905:in `eval': (erb):6: syntax error, unexpected '=', expecting end-of-input (SyntaxError)
;  = @due_date ; _erbout.<< "\\n\\n...**

Everything in the stack trace references CSV and ERB lines, so I can't see anything I can correct on my end. Am I missing something?

Update: letter_template.rb added:

Dear <%= @first_name %> <%= @last_name %>,

The following library book is overdue.

"<%= @title %>"
Due: <% = @due_date %>

Overdue fee: <%= @fee %>

Thank you for your prompt attention to this matter.

1 Answers1

0

The stack trace shows lines from ERb because ERb code is the one that is executing.

While the issue could theoretically be in either ERb itself or your template, it is much more likely that the issue is in your template given that ERb is used by thousands of developers and applications daily.

D. SM
  • 13,584
  • 3
  • 12
  • 21
  • Good call. The letter template had an erroneous whitespace in one of the opening expression tags. Removing the space fixed everything. I'm adding the original template to the OP. Thanks! –  Jan 10 '21 at 21:30