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 :type
ou :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.