Это возможно и не должно быть так сложно.
Я бы хотел использовать более ООП подход, чем использование case
операторов:
# helpers/<model_name>/flash/flash.rb
# frozen_string_literal: true
module Users
module Flash
class Flash
ALERT_PREFIX = 'alert-'
XMLNS = 'http://www.w3.org/2000/svg'
include ActionView::Helpers::TagHelper
include ActionView::Context
def class_attr; end
def status_text; end
def icon; end
end
end
end
Этот класс определяетобщий метод для каждого унаследованного объекта (успех, информация, ошибка, предупреждение), константы и включаемые внешние модули.
# helpers/<model_name>/flash/notice.rb
# frozen_string_literal: true
module Users
module Flash
class Notice < Flash
def class_attr
"#{ALERT_PREFIX}info"
end
def status_text
content_tag(:p, 'Some Status', class: 'text-sm')
end
def icon
content_tag(
:svg,
class: 'fill-current h-6 w-6 text-teal-500 mr-4',
xmlns: XMLNS,
viewBox: '0 0 20 20') do
content_tag(
:path,
nil,
d: 'M2.93 17.07A10 10 0 1 1 17.07 2.93 10 10 0 0 1 2.93 17.07zm12.73-1.41A8 8 0 1 0 4.34 4.34a8 8 0 0 0 11.32 11.32zM9 11V9h2v6H9v-4zm0-6h2v2H9V5z'
)
end
end
end
end
end
Файлы, наследуемые от Flash
, переопределяют методы по своей собственной логике.На этот раз без условий.
Когда метод не определен в дочернем классе Flash
, он возвращает nil, поскольку вызывает метод в своем родительском классе, который не имеет тела, поэтомувозвращает просто nil
.
# helpers/<model_name>/flash/error.rb
# frozen_string_literal: true
module Users
module Flash
class Error < Flash
def class_attr
"#{ALERT_PREFIX}error"
end
end
end
end
Теперь вы можете просто создать экземпляр класса и вызвать необходимый метод:
<%= <model_name>::Flash::Notice.new.class_attr %>
<%= <model_name>::Flash::Notice.new.status_text %>
<%= <model_name>::Flash::Notice.new.icon %>
Уведомление о создании svg
и path
HTML элементы, я использовал вложенные content_tag
s.У svg
определен класс, плюс необходимые опции (xmlns
, viewbox
), которые позволяют открывать блок и помещать внутрь path
, который имеет аргумент nil
, так как он больше не отображаетсодержимое, чем сам тег.
d
просто добавляется в path
с использованием аргумента параметров, принимаемого методом content_tag
.
def icon
content_tag(
:svg,
class: 'fill-current h-6 w-6 text-teal-500 mr-4',
xmlns: XMLNS,
viewBox: '0 0 20 20') do
content_tag(
:path,
nil,
d: 'M2.93 17.07A10 10 0 1 1 17.07 2.93 10 10 0 0 1 2.93 17.07zm12.73-1.41A8 8 0 1 0 4.34 4.34a8 8 0 0 0 11.32 11.32zM9 11V9h2v6H9v-4zm0-6h2v2H9V5z'
)
end
end