如何将字符串插值代码传递到Rails应用模板代码块?

时间:2019-06-07 07:10:04

标签: ruby-on-rails ruby heredoc

根据Rails Application Templates,这是将红宝石代码写入文件的方式:

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:在apply中:Rails :: Generators :: AppGenerator:0x00005557a8d85090(NameError)的未定义局部变量或方法first_name

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

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

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

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

我该如何处理?

1 个答案:

答案 0 :(得分:2)

您正在尝试将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