Skip to content

Instantly share code, notes, and snippets.

@macfanatic
Created January 31, 2017 19:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save macfanatic/718c692464fc47185ab1659842eeb6d4 to your computer and use it in GitHub Desktop.
Save macfanatic/718c692464fc47185ab1659842eeb6d4 to your computer and use it in GitHub Desktop.
module ActiveAdmin
module StateMachine
module DSL
#
# Easily tie into a state_machine action
#
# @param [Symbol] state machine event, ie: :publish
# @param [Hash] options
# - permission [Symbol] permission to check authorization against
# - http_verb [Symbol] :put, :post, :get, etc
#
# Will call "resource.publish!", if "resource.can_publish?" returns true
#
def state_action(action, options={}, &controller_action)
singular = config.resource_name.singular
plural = config.resource_name.plural
options[:permission] ||= controller.new.send(:action_to_permission, action)
confirmation = options.fetch(:confirm, false)
if confirmation == true
default = "Are you sure you want to #{action.to_s.humanize.downcase}?"
confirmation = ->{ I18n.t(:confirm, scope: "#{plural}.#{action}", default: default) }
end
http_verb = options.fetch :http_verb, :put
action_item only: :show do
if resource.send("can_#{action}?") && authorized?(options[:permission], resource)
path = resource_path << "/#{action}"
label = I18n.t("#{plural}.#{action}.label", default: action.to_s.titleize)
link_options = {}
if confirmation.is_a?(Proc)
link_options[:data] ||= {}
link_options[:data][:confirm] = instance_exec(&confirmation)
end
link_options[:class] = "btn btn-large"
link_options[:method] = http_verb
link_to label, path, link_options
end
end
unless block_given?
controller_action = -> do
resource.send("#{action}!")
flash[:notice] = t("#{plural}.#{action}.flash.success")
redirect_to smart_resource_url
end
end
member_action action, method: http_verb, &controller_action
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment