Rails:Slim template subroutine example
Appearance
Problem
How do I use methods/functions/subroutines in Slim template language of Ruby on Rails?
Environment
- rails-7
- slim-5.1.1
Solution
/ app/views/users/show.html.slim
/ Params
- user
- content_for(:title) { 'Customer details' }
ruby:
def do_tbody(user)
contents = <<~SLIM
- index = 1
tr(class = (index.even? ? 'odd' : 'even'))
td.col company name
td.col #{user.company_name}
- index += 1
tr(class= (index.even? ? 'odd' : 'even'))
td.col email
td.col #{user.email}
SLIM
Slim::Template.new { contents }.render
end
div.table
table.table(border=nil cellspacings=nil cellpadding=nil)
== do_tbody(user)Journal
20250821
Trying within helpers/application_helper as well, but error isn't accessible. Solution: put Slim code in template partial shared/_form_errors.html.slim.
def form_errors(obj)
return unless obj&.errors&.count&.positive?
# tag.hr
# tag.ul class: 'text-danger' do
# obj.errors.each do |error|
# tag.li class: 'text-danger' do
# tag.a class: 'text-danger', href: "##{obj.class.name.underscore.gsub('/', '_')}_#{error.attribute}" do
# error.full_message
# end
# end
# end
# end
slim = <<~SLIM
hr
ul.text-danger
- errors.each do |error|
li.text-danger
a.text-danger href="##{self.class.name&.underscore&.gsub('/', '_')}_#{error.attribute}"
/ a.text-danger href="{class.name.underscore.gsub('/', '_')}"
/ error.attribute
= error.full_message
SLIM
Slim::Template.new { slim }.render(obj).html_safe
end