Um ajudante de botão de divisão de base 5 para rubi

Basta colar no ApplicationHelper

def button_split(text, link, options = {})
options_default
= { drop_id: "1", size: :tiny, type: :secondary}
options
.reverse_merge!(options_default)
options
[:class] = options[:class].to_s + " #{options[:size].to_s} #{options[:type].to_s} button split"
drop_id
= options[:drop_id] || "1"
first_link
= link_to(link, options) do
concat text

concat content_tag
(:span, "", data: { dropdown: "drop-#{drop_id}"})
end
content_tag
(:br)
links
= first_link
links
<< content_tag(:ul, class: "f-dropdown", id: "drop-#{drop_id}",data: {"dropdown-content" =>""}) do
if block_given?
x
= Array.new
links_for_li
= yield(x)
links_for_li
.collect { |link| concat content_tag(:li, link)}
end
end
links

end

E use-o em suas visualizações

Os dois primeiros parâmetros são o texto e a url do primeiro link, opcionalmente você pode passar por opções de hash {} para o link como: método: remoto etc. O tamanho do botão e o tipo podem ser passados ​​com :typeou :size.
Finalmente você passa um bloco com argumento e adiciona os outros links

Neste exemplo, estou usando SLIM

= button_split 'Show', requirement, size: :tiny do |x|
- x << link_to('Approve', approve_requirement_path(requirement), method: :post,
data
: { confirm: 'Are you sure?' })
- x << link_to('Edit', edit_requirement_path(requirement))
- x << link_to('Delete', requirement, method: :delete,
data
: { 'confirm' => 'Are you sure?' })

E se houver mais de um, você deve passar um id personalizado nas opções para evitar qualquer bug {drop_id: index} (não elegante, mas necessário) qualquer refatoração é bem-vinda.