Рубиновый синтаксис внутри heredoc? - PullRequest
7 голосов
/ 11 сентября 2010

Я хочу перебрать массив внутри Ruby-наследника.

<<-BLOCK
Feature: User logs in
  In order to post content
  As an user
  I want to log in

<< Here i want to iterate scenarios >>
BLOCK

"сценарии" - это массив, который я хочу зациклить. Для каждого элемента я хочу распечатать:

Scenario: #{scenario}
  Given
  When
  Then

Так, например, если «сценарии» содержат:

scenarios[0] = "User successfully logs in"
scenarios[1] = "User failed to log in"

Я хочу, чтобы строка heredoc была:

<<-BLOCK
Feature: #{feature}
  In order to #{in_order_to}
  As #{as}
  I want #{i_want}

Scenario: User successfully logs in
  Given
  When
  And

Scenarios: User failed to log in
  Given
  When
  And
BLOCK

Как выполнить итерацию в Ruby heredoc?

Ответы [ 2 ]

16 голосов
/ 11 сентября 2010

Вы можете использовать ERB. Было бы чище и не намного больше кода:

require 'erb'
s = ERB.new(<<-BLOCK).result(binding)
Feature: User logs in
  In order to post content
  As an user
  I want to log in

<% scenarios.map do |x| %>
  Scenario: <%= x %>
  Given
  When
  Then
<% end %>
BLOCK

Первая строка может выглядеть странно, поэтому я ее разбью

s = ERB.new(<<-BLOCK).result(binding)

ERB.new создает новый шаблон erb с переданной строкой в ​​качестве содержимого. <<-BLOCK - это heredoc, который говорит, что следует взять значение heredoc, которое следует, и подставить его в выражение. result(binding) Оценивает шаблон в текущем контексте (binding является контекстом текущей оценки).

Оттуда вы можете легко извлекать ваши шаблоны в файлы по мере их увеличения.

Подробнее о наследственности Руби Джеймса Эдварда Грея II

10 голосов
/ 11 сентября 2010

Вы можете сделать это, но я не уверен, что это наиболее читаемый подход:

s = <<-BLOCK
Feature: User logs in
  In order to post content
  As an user
  I want to log in

#{scenarios.map{|x|
<<-INNERBLOCK
Scenario: #{x}
  Given
  When
  Then
INNERBLOCK
}}

BLOCK
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...