首页 > 解决方案 > 如何将字符串插值代码传递给 Rails 应用程序模板代码块?

问题描述

根据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

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

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

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

我该如何处理?

标签: ruby-on-railsrubyheredoc

解决方案


您正在尝试将 heredoc字符串插值一起使用,这显然在尝试 interpolate 时失败了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

推荐阅读