Как я могу продублировать этот код PHP в Ruby? - PullRequest
1 голос
/ 14 октября 2011

Я перемещаю некоторые проекты в Rails, и я хотел бы продублировать этот код PHP:

http://www.php.net/manual/en/functions.anonymous.php#106046

пока у меня есть это:

def html (tag, id = "", hclass = "")
  hopen = "<#{tag}"
  hclose = "</#{tag}>"
  unless id == ""
    hopen += " id=\"#{id}\""
  end

  unless hclass == ""
    hopen += " class=\"#{hclass}\""
  end

  hopen += ">"

  return lambda  { |data| print hopen,data,hclose}
end

Мне нужно создать переменные переменные, например: PHP

$layout = array('container','header','pmain','lsidebar','rsidebar','footer');

foreach ($layout as $element)
   $$element = html ("div", $element);

Вот мой прототип RUBY

layout = [:body, :header, :sidebar, :footer]

##I know this isn't right, but how do I create the dynamic functions like PHP???
layout.each {|x| instance_variable_set "@#{x}", 0 }

Также,Мне нужно вызывать функции, есть ли вообще сделать это без метода вызова?Будет грязно, если мне придется вкладывать звонки.

h1 = html(:h1)
mainx =  html(:div )
puts mainx.class
puts mainx.call(h1.call("Blog!")) 

Ответы [ 2 ]

4 голосов
/ 14 октября 2011

Вы много здесь делаете, но вот некоторая помощь с переходом:

$layout = array('container','header','pmain','lsidebar','rsidebar','footer');

foreach ($layout as $element)
  $$element = html ("div", $element);

Насколько я могу судить, это преобразование массива, так что эквивалент это:

layout = [ @container, @header, @pmain, @lsidebar, @rsidebar, @footer]

layout.collect! do |element|
  # Using the built-in content_tag method instead of
  # the custom reimplementation with curried parameters.
  content_tag("div", element)
end

В Ruby нет способа отменить ссылку на переменную, поскольку переменные в Ruby ведут себя совершенно иначе.Переменные экземпляра сохраняются в контексте объекта, тогда как переменные сохраняются только в заданной области видимости.Вы можете получить и установить произвольные переменные экземпляра по имени, но вы обычно не можете сделать то же самое с локальными переменными.В Ruby нет эквивалента $$var, кроме eval { var }, который действительно вызывает недовольство из-за того, как он оценивает потенциально произвольный код.

У меня действительно плохое предчувствие, почему вам нужно это сделать, хоть.Предполагается, что с помощью шаблонов можно обойтись на этом низком уровне.

Если вы новичок в Ruby, вам стоит прочитать документацию по String и Array, поскольку оба они заполнены до отказа.полезных методов.Массив также включает в себя модуль Enumerable, который добавляет еще больше.

2 голосов
/ 14 октября 2011

Если вы работаете над проектом rails, есть много помощников, которые помогут вам построить html

На самом деле, есть вспомогательный метод с именем ** content_tag **, который делает то же самое.Документацию можно посмотреть здесь: http://apidock.com/rails/v3.1.0/ActionView/Helpers/TagHelper/content_tag

Пример использования

content_tag(:tag_i_want, :id => 'my_id', :class => 'my_class') do
   "the content I want inside the tag"
end

Выводы:

<tag_i_want id="my_id" class="my_class">the content I want inside the tag</tag_i_want>

Второй вопрос немного странный.Объясните больше, что вы хотите сделать.¿Создать переменные @body, @header, @sidebar и @footer? Ats Это все?

...