Строка заменить регулярное выражение, как усы js для Ruby

Я новичок в рубине и пытался сделать простую функцию, которая брала бы файл и заменяла все усы массивом. Например:

простой.tpl

<p>Hello {{person_name}}</p>
<p>{{welcome_msg}}</p>

Я хочу изменить его с помощью массива ключей и значений.

class Template

    attr_accessor :file_name

    def parse_template (array_to_replace)
        str = File.read(file_name)

        array_to_replace.each do |item|
        # required code here ...
        end

        return str
    end

end

Кто-нибудь может поставить нужный код???

Ожидаемый результат

Я не знаю, как многомерные массивы работают в ruby, но я хочу:

the_arr = Array(
   :person_name => "John Doe",
   :welcome_msg => "Hello friend"
)
object = Template.new
object.file_name = "simple.tpl"
output = object.parse_template(the_arr);

puts output

я должен получить

<p>Hello John Doe</p>
<p>Hello friend</p>

person Anonymous    schedule 04.09.2014    source источник
comment
покажите ожидаемый результат..   -  person Arup Rakshit    schedule 04.09.2014
comment
Вероятно, вам следует сначала изучить базовый учебник по Ruby.   -  person Patrick Oscity    schedule 04.09.2014
comment
эммм почему? у меня так много ошибок в моем коде?   -  person Anonymous    schedule 04.09.2014
comment
Я говорю это из-за используемого вами синтаксиса Array(). Это очень необычно и показывает, что вы на самом деле не пытались изучать Ruby, вы просто переводите синтаксис PHP в синтаксис Ruby. Однако изучение Ruby требует не только изучения синтаксиса, но вам, вероятно, также придется освоить некоторые новые концепции. То, что вы, вероятно, хотели, это Hash, которое будет рассмотрено в первых разделах любого базового руководства по ruby.   -  person Patrick Oscity    schedule 04.09.2014


Ответы (2)


Вы можете использовать жемчужину mustache:

require 'mustache'

attributes = {
  :person_name => "John Doe",
  :welcome_msg => "Hello friend"
}

template = File.read('simple.tpl')

output = Mustache.render(template, attributes)

puts output
# <p>Hello John Doe</p>
# <p>Hello friend</p>
person Patrick Oscity    schedule 04.09.2014
comment
attributes = { :person_name => "John Doe", :welcome_msg => "Hello friend" } это массив или объект?? - person Anonymous; 04.09.2014
comment
@Anonymous это хэш, а также объект - person Stefan; 04.09.2014
comment
Вы столкнулись с еще одним свойством Ruby: все является объектом. - person Patrick Oscity; 04.09.2014
comment
как бы мы получили значение, скажем, :person_name ? Как 2_ ?? - person Anonymous; 04.09.2014
comment
@Anonymous attributes[:person_name], см. Hash документацию - person Stefan; 04.09.2014
comment
Я ненавижу повторяться, но вы действительно должны прочитать учебник! - person Patrick Oscity; 04.09.2014
comment
Да, это объект, в котором реализован метод [] ;-) - person Patrick Oscity; 04.09.2014
comment
Вот интересный способ сделать первые шаги в Ruby: tryruby.org, полный список ресурсов доступен здесь. : ruby-lang.org/en/documentation - person Patrick Oscity; 04.09.2014
comment
Хорошо, большое спасибо, но не могли бы вы сказать мне, как установить усы. Я имею в виду, куда поместить эту папку github для работы require 'mustache' - person Anonymous; 04.09.2014
comment
У меня есть два файла в папке index.rb и simple.tpl - person Anonymous; 04.09.2014
comment
Вам нужно установить его с rubygems. Просто введите gem install mustache в командной строке. Вам не нужно загружать исходный код вручную. Опять же, сделать учебник. - person Patrick Oscity; 04.09.2014

Вам может быть интересно, что встроено в Ruby.

string = '<p>Hello %{person_name}</p>
          <p>%{welcome_msg}</p>'

attributes = {
  :person_name => "John Doe",
  :welcome_msg => "Hello friend"
}

puts string % attributes

Выход:

<p>Hello John Doe</p>
<p>Hello friend</p>

Объяснение:

Класс String определяет метод с именем % (да, в Ruby вы можете использовать не буквенно-цифровые символы в именах методов). Это делает замену %{key} в стиле шаблона значениями из хэша. Он также может выполнять форматирование чисел и строк; см. документацию по методу % Чтобы получить больше информации.

person Mark Thomas    schedule 04.09.2014
comment
для чего нужен символ %?? - person Anonymous; 04.09.2014
comment
Я добавил объяснение. - person Mark Thomas; 04.09.2014
comment
Большое спасибо, я проголосую за ваш ответ. Спасибо большое - person Anonymous; 04.09.2014
comment
Да знаю... Но предыдущий ответ был лучше. В любом случае, у вас есть 19.k repu.. Что еще вам нужно ;) Спасибо в любом случае - person Anonymous; 04.09.2014
comment
@Anonymous SO заключается не в том, чтобы накопить как можно больше повторений, а в том, чтобы найти наилучший возможный ответ. Вы должны принять ответ, который лучше всего отвечает на ваш вопрос и / или решает вашу проблему наилучшим образом — иногда это сообщение, которое не отвечает на вопрос напрямую, а скорее пытается придумать альтернативный подход, который решает то же самое. задача намного изящнее. - person Patrick Oscity; 04.09.2014
comment
Спасибо @ p11y, вы правы, дело не в представителе, а в самом полезном ответе. Он нашел драгоценный камень с усами (ваш ответ) лучшим решением для своих нужд, что совершенно нормально. - person Mark Thomas; 04.09.2014
comment
Да, я просто хотел указать на это, чтобы он не принимал ответы, основанные на том, кому больше всего нужна репутация в будущем ;-) - person Patrick Oscity; 04.09.2014