如何将字符串插值代码传递给 Rails Application Template CODE 块?

How to pass string interpolation code to Rails Application Template CODE block?

根据 Rails Application Templates 这是将 ruby 代码写入文件的方法:

file 'path/to/my_file.rb', <<-CODE
  class Object
    def not_nil?
      !nil?
    end

    def not_blank?
      !blank?
    end
  end
CODE

然而,当我尝试在 <<-CODECODE 之间添加包含字符串插值的代码时,它在第一次出现时失败了。

我的 file 电话:

file 'lib/person.rb', <<-CODE
# frozen_string_literal: true

class Person
  def initialize(first_name, last_name)
    @full_name = "#{first_name.capitalize} #{last_name.capitalize}#"
  end
end
CODE

错误信息:

template.rb:50:in apply: undefined local variable or method first_name for Rails::Generators::AppGenerator:0x00005557a8d85090 (NameError)

我的理解是模板生成器试图执行内插代码。

我尝试的只是转义 " 双引号,例如:

file 'lib/person.rb', <<-CODE
# frozen_string_literal: true

class Person
  def initialize(first_name, last_name)
    @full_name = \"#{first_name.capitalize} #{last_name.capitalize}#\"
  end
end
CODE

但它没有帮助,导致完全相同的错误。

我该如何解决这个问题?

您正在尝试使用 heredoc 字符串插值,这显然在尝试插值 first_name 时失败了。要防止 heredoc 字符串插值,请改用 FOO<<-'CODE'

file 'lib/person.rb', <<-'CODE'
# frozen_string_literal: true

class Person
  def initialize(first_name, last_name)
    @full_name = "#{first_name.capitalize} #{last_name.capitalize}#"
  end
end
CODE