Hello World
1. Create UI components in pure Ruby
Craft your UI based on your components written in pure Ruby. Utilizing Ruby's amazing language features, you're able to create a cleaner and more maintainable UI implementation.
Implement UI components in pure Ruby
Create Ruby classes within your Rails project and call Matestack's core components through a Ruby DSL in order to craft your UIs. The Ruby method "div" for example calls one of the static core components, responsible for rendering HTML tags. A component can take Strings, Integers Symbols, Arrays or Hashes (...) as optional properties (e.g. "title") or require them (e.g. "body").
app/matestack/components/card.rb
Use your Ruby UI components on your existing Rails views
Components can be then called on Rails views (not only! see below), enabling you to create a reusable card components, abstracting UI complexity in your own components.
app/views/your_view.html.erb
Learn more:
Use Ruby methods as partials
Split your UI implementation into multiple small chunks helping others (and yourself) to better understand your implementation. Using this approach helps you to create a clean, readable and maintainable codebase.
app/matestack/components/card.rb
app/views/your_view.html.erb
Use class inheritance
Because it's just a Ruby class, you can use class inheritance in order to further improve the quality of your UI implementation. Class inheritance can be used to easily create variants of UI components but still reuse parts of the implementation.
app/matestack/components/blue_card.rb
app/views/your_view.html.erb
Use components within components
Just like you used Matestack's core components on your own UI component, you can use your own UI components within other custom UI components. You decide when using a Ruby method partial should be replaced by another self contained UI component!
app/matestack/components/card.rb
app/matestack/components/card_body.rb
Yield components into components
Sometimes it's not enough to just pass simple data into a component. No worries! You can just yield a block into your components! Using this approach gives you more flexibility when using your UI components. Ofcourse yielding can be used alongside passing in simple params.
app/matestack/components/card.rb
app/matestack/components/card_body.rb
Use named slots for advanced content injection
If you need to inject multiple blocks into your UI component, you can use "slots"! Slots help you to build complex UI components with multiple named content placeholders for highest implementation flexibility!
app/matestack/components/card.rb
app/matestack/components/card_body.rb
2. Substitute Rails Views with Matestack Pages
Until here we used Matestack components on Rails views. If desired you can go one step further and use Matestack components on something called a Matestack Page:
A Matestack page can be compared to a Rails view and might be yielded within a layout provided by an associated Matestack layout class (see below). The page itself uses Matestack's HTML rendering mechanism in a response
method and may additionally call other components in order to define a specific UI.
Pages are used as Rails view substitutes and therefore called in a Rails controller action:
The page response - in this case - will be yielded into the Rails layout if not specified differently.
Learn more:
3. Wrap Matestack Pages in Matestack Layouts
Just like a Rails layout would yield a Rails view, a Matestack layout yields a Matestack page. The layout uses Matestack's HTML rendering mechanism in a response
method and may additionally call other components in order to define a specific UI.
In this basic example the layout is using the methods h1
and main
in order to create the markup as well as a yield
in order to yield a page on a specific position.
A Matestack layout itself will be yielded into the Rails layout, unless the Rails layout is disabled in the controler via:layout false
Usually a layout implies a specific context of your application. Multiple pages are then scoped within that context, which could lead to a file structure like:
and then used in a controller like this:
Learn more:
If you have any questions, let us know on Discord: https://discord.com/invite/c6tQxFG
Last updated