【问题标题】:How to pass string interpolation code to Rails Application Template CODE block?如何将字符串插值代码传递给 Rails 应用程序模板代码块?
【发布时间】:2019-10-22 16:19:49
【问题描述】:

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

但是,当我尝试在 &lt;&lt;-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: 未定义的局部变量或方法 first_name 用于 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

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

我该如何处理?

【问题讨论】:

  • 你可以转义#,而不是"

标签: ruby-on-rails ruby heredoc


【解决方案1】:

您正在尝试使用 heredoc with 字符串插值,这显然在尝试插值 first_name 时失败。要防止 heredoc 字符串插值,请改用 FOO&lt;&lt;-'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

【讨论】:

  • 超酷,感谢帮助,成功了,我会在 7 分钟内接受!
猜你喜欢
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多