纯Ruby中的HTML

时间:2015-12-28 08:37:02

标签: ruby-on-rails ruby

是否存在用于编写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等。

5 个答案:

答案 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>"