Как передать код интерполяции строки в блок CODE шаблона приложения Rails? - PullRequest
0 голосов
/ 07 июня 2019

В соответствии с шаблонами приложений Rails так можно записать код 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: неопределенная локальная переменная или метод 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

но это не помогло, что привело к точно такой же ошибке.

Как мне подойти к этому?

1 Ответ

2 голосов
/ 07 июня 2019

Вы пытаетесь использовать 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
...