Transform your view logic into elegant, semantic HTML with the power of pure Ruby! ๐โจ
Ruby2html is a magical gem that allows you to write your views in pure Ruby and automatically converts them into clean, well-formatted HTML. Say goodbye to messy ERB templates and hello to the full power of Ruby in your views! ๐
Add this line to your application's Gemfile:
gem 'ruby2html'
And then execute:
$ bundle install
Or install it yourself as:
$ gem install ruby2html
File: app/views/your_view.html.rb
div class: 'container' do
h1 'Welcome to Ruby2html! ๐', class: 'main-title', 'data-controller': 'welcome'
link_to 'Home Sweet Home ๐ ', root_path, class: 'btn btn-primary', 'data-turbo': false
@items.each do |item|
h2 class: 'item-title', id: "item-#{item[:id]}" do
item[:title]
end
p class: 'item-description' do
item[:description]
end
end
end
plain '<div>Inline html</div>'.html_safe
render partial: 'shared/navbar'
File: app/controllers/application_controller.rb
# frozen_string_literal: true
class ApplicationController < ActionController::Base
include Ruby2html::RailsHelper
end
File: app/views/your_view.html.erb
Replace your ERB with beautiful Ruby code:
<%=
html(self) do
h1 "Welcome to Ruby2html! ๐", class: 'main-title', 'data-controller': 'welcome'
div id: 'content', class: 'container' do
link_to 'Home Sweet Home ๐ ', root_path, class: 'btn btn-primary', 'data-turbo': false
end
@items.each do |item|
h2 class: 'item-title', id: "item-#{item[:id]}" do
item[:title]
end
p class: 'item-description' do
item[:description]
end
end
plain "<div>Inline html</div>".html_safe
render partial: 'shared/navbar'
end
%>
ruby 3.3.3 (2024-06-12 revision f1c7b6f435) +YJIT [x86_64-linux]
Warming up --------------------------------------
GET /benchmark/html (ERB)
2.000 i/100ms
GET /benchmark/ruby (Ruby2html)
1.000 i/100ms
Calculating -------------------------------------
GET /benchmark/html (ERB)
20.989 (ยฑ19.1%) i/s - 102.000 in 5.077353s
GET /benchmark/ruby (Ruby2html)
20.438 (ยฑ19.6%) i/s - 97.000 in 5.010249s
Comparison:
GET /benchmark/html (ERB): 21.0 i/s
GET /benchmark/ruby (Ruby2html): 20.4 i/s - same-ish: difference falls within error
Ruby2html seamlessly integrates with ViewComponents, offering flexibility in how you define your component's HTML structure. You can use the call
method with Ruby2html syntax, or stick with traditional .erb
template files.
File: app/components/application_component.rb
# frozen_string_literal: true
class ApplicationComponent < ViewComponent::Base
include Ruby2html::ComponentHelper
end
File: app/components/greeting_component.rb
# frozen_string_literal: true
class GreetingComponent < ApplicationComponent
def initialize(name)
@name = name
end
def call
html(self) do
h1 class: 'greeting', 'data-user': @name do
"Hello, #{@name}! ๐"
end
p class: 'welcome-message' do
'Welcome to the wonderful world of Ruby2html!'
end
end
end
end
File: app/components/farewell_component.rb
# frozen_string_literal: true
class FarewellComponent < ApplicationComponent
def initialize(name)
@name = name
end
end
File: app/components/farewell_component.html.erb
<div class="farewell">
<h2>Goodbye, <%= @name %>! ๐</h2>
<p>We hope you enjoyed using Ruby2html!</p>
<%=
html do
link_to 'Home', root_path, class: 'btn btn-primary', 'data-turbo': false
end
%>
</div>
This flexibility allows you to:
- Use Ruby2html syntax for new components or when refactoring existing ones
- Keep using familiar ERB templates where preferred
- Mix and match approaches within your application as needed
File: app/components/first_component.rb
# frozen_string_literal: true
class FirstComponent < ApplicationComponent
def initialize
@item = 'Hello, World!'
end
def call
html(self) do
h1 id: 'first-component-title' do
'first component'
end
div class: 'content-wrapper' do
h2 'A subheading'
end
p class: 'greeting-text', 'data-testid': 'greeting' do
@item
end
end
end
end
File: app/components/second_component.rb
# frozen_string_literal: true
class SecondComponent < ApplicationComponent
def call
html(self) do
h1 class: 'my-class', id: 'second-component-title', 'data-controller': 'second' do
'second component'
end
link_to 'Home', root_path, class: 'nav-link', 'data-turbo-frame': false
end
end
end
renderer = Ruby2html::Render.new(nil) do # nil is the context, you can use self or any other object
html do
head do
title 'Ruby2html Example'
end
body do
h1 'Hello, World!'
end
end
end
puts renderer.render # => "<html><head><title>Ruby2html Example</title></head><body><h1>Hello, World!</h1></body></html>"
One of the best features of Ruby2html is that you don't need to rewrite all your views at once! You can adopt it gradually, mixing Ruby2html with your existing ERB templates. This allows for a smooth transition at your own pace.
File: app/views/your_mixed_view.html.erb
<h1>Welcome to our gradually evolving page!</h1>
<%= render partial: 'legacy_erb_partial' %>
<%=
html(self) do
div class: 'ruby2html-section' do
h2 "This section is powered by Ruby2html!"
p "Isn't it beautiful? ๐"
end
end
%>
<%= render ModernComponent.new %>
<footer>
<!-- More legacy ERB code -->
</footer>
In this example, you can see how Ruby2html seamlessly integrates with existing ERB code. This approach allows you to:
- Keep your existing ERB templates and partials
- Gradually introduce Ruby2html in specific sections
- Use Ruby2html in new components while maintaining older ones
- Refactor your views at your own pace
Remember, there's no rush! You can keep your .erb
files and Ruby2html code side by side until you're ready to fully transition. This flexibility ensures that adopting Ruby2html won't disrupt your existing workflow or require a massive rewrite of your application. ๐
After checking out the repo, run bin/setup
to install dependencies. Then, run rake spec
to run the tests. You can also run bin/console
for an interactive prompt that will allow you to experiment.
Bug reports and pull requests are welcome on GitHub at https://github.com/sebyx07/ruby2html. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.
The gem is available as open source under the terms of the MIT License.
Everyone interacting in the Ruby2html project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.
- Write views in pure Ruby ๐
- Seamless Rails integration ๐ค๏ธ
- ViewComponent support with flexible template options ๐งฉ
- Automatic HTML beautification ๐
- Easy addition of custom attributes and data attributes ๐ท๏ธ
- Gradual adoption - mix with existing ERB templates ๐ข
- Improved readability and maintainability ๐
- Full access to Ruby's power in your views ๐ช
Start writing your views in Ruby today and experience the magic of Ruby2html! โจ๐ฎ