如何将字符串插值代码传递给 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
然而,当我尝试在 <<-CODE
和 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 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
根据 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
然而,当我尝试在 <<-CODE
和 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
apply
: undefined local variable or methodfirst_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