Reusing Rails Views or Partials
Matestack rails_render
component offers the possibility to render a view or partial by passing it's name and required params to it
Components reusing partials
Imagine the partial app/views/products/_teaser.html.erb
containing following content:
<%= link_to product_path(product), class: 'product-teaser' do %>
<div>
<h2><%= product.name %></h2>
<p><%= product.description %></p>
<b><%= product.price %></b>
</div>
<% end %>
class Components::Products::Trending < Matestack::Ui::Component
def prepare
@products = Product.where(trending: true)
end
def response
h1 'Trending products'
@products.each do |product|
rails_render partial: '/products/teaser', locals: { product: product }
end
end
end
As you see, we used the rails_render
component here to render our products teaser partial. Given the string rails searches for a partial in app/views/products/_teaser.html.erb
. As our product teaser partial uses a product
we pass in a product as a local
.
rails_render
works with ERB, Haml and Slim Templates, as long as you have installed and configured the desired templating engine correctly in your Rails app.
Components reusing views
As mentioned above the rails_render
component can not only render partials but also views. Following Rails view can be reused within a Matestack component:
app/views/static/index.html.erb
<main>
<%= render partial: 'products/teaser', collection: products, as: :product %>
</main>
<div>
<%= link_to 'All products', products_path %>
</div>
class Components::Products::Index < Matestack::Ui::Component
def prepare
@products = Product.where(trending: true)
end
def response
rails_render template: '/static/index', locals: { products: @products }
end
end
Last updated
Was this helpful?