Шаблоны Ruby: Как передать переменные во встроенный ERB?

На самом деле самый эффективный путь таким образом:

function is_assoc($array){
   $keys = array_keys($array);
   return $keys !== array_keys($keys);
}

Это работает, потому что это сравнивает ключи (которые для последовательного массива всегда являются 0,1,2 и т.д.) к ключам ключей (который, будет всегда быть 0,1,2 и т.д.).

53
задан ivan_ivanovich_ivanoff 26 August 2009 в 18:08
поделиться

3 ответа

Понятно!

Я создаю класс привязок

class BindMe
    def initialize(key,val)
        @key=key
        @val=val
    end
    def get_binding
        return binding()
    end
end

и передаю экземпляр в ERB

dataHash.keys.each do |current|
    key = current.to_s
    val = dataHash[key]

    # here, I pass the bindings instance to ERB
    bindMe = BindMe.new(key,val)

    result = template.result(bindMe.get_binding)

    # unnecessary code goes here
end

Файл шаблона .erb выглядит следующим образом:

Key: <%= @key %>
10
ответ дан 7 November 2019 в 08:33
поделиться

Я не могу дать вам точного ответа, почему это происходит, потому что я не уверен на 100%, как работает ERB, но просто смотрю на ERB RDocs , в нем говорится, что вам нужна привязка , которая является «объектом привязки или Proc, который используется для установки контекста оценки кода».

Попробовать приведенный выше код еще раз и просто заменить

result = template.result

на

result = template.result(binding)

заставил это работать.

Я уверен / надеюсь, что кто-то вмешается и предоставит более подробное объяснение того, что происходит. Ура.

РЕДАКТИРОВАТЬ: Для получения дополнительной информации о Привязке и для того, чтобы сделать все это немного понятнее (по крайней мере, для меня), ознакомьтесь с Binding RDoc .

4
ответ дан 7 November 2019 в 08:33
поделиться

РЕДАКТИРОВАТЬ : Это грязный обходной путь. Пожалуйста, посмотрите мой другой ответ.

Это совершенно странно, но добавление

current = ""

перед циклом «for-each» решает проблему.

Да благословит Бог языки сценариев и их «языковые особенности» ...

0
ответ дан 7 November 2019 в 08:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: