Rails:Slim template subroutine example

From FVue
Jump to: navigation, search

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