我正在将一些项目移到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!"))
答案 0 :(得分:4)
你在这里做了很多,但这里有一些过渡的帮助:
$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中的变量以完全不同的方式运行。实例变量在对象的上下文中持久存在,而变量仅在给定范围内持久存在。您可以按名称获取和设置任意实例变量,但通常不能对局部变量执行相同操作。除了$$var
之外,Ruby中没有eval { var }
等价物,由于它可能会对任意代码进行评估,因此它实际上是不受欢迎的。
如果你是Ruby的新手,最好的办法是阅读有关String和Array的文档,因为它们都充满了有用的方法。 Array还包括Enumerable模块,它可以添加更多。
答案 1 :(得分:2)
如果您正在使用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,@ head,@ sidebar和@footer变量?¿全部?