是否存在用于编写rails视图助手甚至视图的gem?如果没有,这样一个宝石的出发点是什么?
div class: 'header' do
h1 { 'Hello World' }
a href: 'http://google.com', class: 'button' do
'Google'
end
end
受近期javascript前端库如何使用纯javascript函数实现基于组件的视图的启发,例如:React,Vue.js等。
答案 0 :(得分:9)
也许Markaby会帮助你,让你通过Ruby生成HTML。
官方文档的一个例子:
require 'markaby'
mab = Markaby::Builder.new
mab.html do
head { title "Boats.com" }
body do
h1 "Boats.com has great deals"
ul do
li "$49 for a canoe"
li "$39 for a raft"
li "$29 for a huge boot that floats and can fit 5 people"
end
end
end
puts mab.to_s
答案 1 :(得分:6)
Arbre将完成这项工作。 它是从广泛使用的ActiveAdmin宝石中提取的,作为满足这种需求的独立解决方案。
项目自述文件中的一个简单示例:
html = Arbre::Context.new do
h2 "Why is Arbre awesome?"
ul do
li "The DOM is implemented in ruby"
li "You can create object oriented views"
li "Templates suck"
end
end
puts html.to_s # =>
将呈现以下内容:
<h2>Why is Arbre awesome?</h2>
<ul>
<li>The DOM is implemented in ruby</li>
<li>You can create object oriented views</li>
<li>Templates suck</li>
</ul>
答案 2 :(得分:1)
首先,您的代码与HAML非常相似:
#app/views/model/your_view.haml
.header
%h1 Hello World
= link_to "Google", "http://google.com", class: "button"
如果您正在寻找一种方法来清理您的观点,那么这可能是一个开始的好地方。
@Meeh
看起来他的答案很好;如果你想要另一种意见,我会开始研究pseudocode。
据我了解,伪代码基本上是一种创建更深层次的“应用程序级”功能的方法。例如......
#app/helpers/view_helper.rb
class ViewHelper
def a approved_site, *options
return "Site not valid" unless Site.exists? name: approved_site.to_s
site = Site.find_by name: approved_site.to_s
options.extract_args!
link_to site.name, site.url, options #-> ruby automatically returns the last line
end
end
...这可以让你打电话:
#app/views/controller/view.haml
= a :google, class: "button"
-
如果你想将它变成一个全面的前端框架,你需要一组“基础”功能。除了这些功能之外,您还有更具体的实现,例如:
#app/helpers/base_helper.rb
class BaseHelper
def meta type, *args
types = %i(js css title link keywords author description robots favicon)
options = args.join(', ')
# Return Values
case type
when :title
Haml::Engine.new("%title #{options}").render
end
end
end
end
#app/helpers/meta_helper.rb
class MetaHelper
def title value
meta :title, value
end
end
答案 3 :(得分:0)
我认为你想要react.rb(http://reactrb.org)做Abre所做的一切,还可以处理客户端交互(如果你需要它。)
答案 4 :(得分:0)
我开发的dom宝石完全符合您的要求。使用它,您可以执行以下操作:
require "dom"
["foo".dom(:span, class: "bold"), "bar"].dom(:div).dom(:body).dom(:html)
# => "<html><body><div><span class=\"bold\">foo</span>bar</div></body></html>"