# -*- coding: utf-8 -*- module Formtastic module Helpers module ActionHelper # Renders an action for the form (such as a subit/reset button, or a cancel link). # # Each action is wrapped in an `
  • ` tag with other classes added based on the # type of action being rendered, and is intended to be rendered inside a {#buttons} # block which wraps the button in a `fieldset` and `ol`. # # The textual value of the label can be changed from the default through the `:label` # argument or through i18n. # # If using i18n, you'll need to provide the following translations: # # en: # formtastic: # actions: # create: "Create new %{model}" # update: "Save %{model}" # cancel: "Cancel" # reset: "Reset form" # submit: "Submit" # # For forms with an object present, the `update` key will be used if calling `persisted?` on # the object returns true (saving changes to a record), otherwise the `create` ey will be # used. The `submit` key is used as a fallback when there is no object or we cannot determine # if `create` or `update` is appropriate. # # @example Basic usage # # form # <%= semantic_form_for @post do |f| %> # ... # <%= f.actions do %> # <%= f.action :submit %> # <%= f.action :reset %> # <%= f.action :cancel %> # <% end %> # <% end %> # # # output #
    # ... #
    #
      #
    1. # #
    2. #
    3. # #
    4. # #
    #
    #
    # # @example Set the value through the `:label` option # <%= f.action :submit, :label => "Go" %> # # @example Pass HTML attributes down to the tag inside the wrapper # <%= f.action :submit, :button_html => { :class => 'pretty', :accesskey => 'g', :disable_with => "Wait..." } %> # # @example Pass HTML attributes down to the `
  • ` wrapper # <%= f.action :submit, :wrapper_html => { :class => 'special', :id => 'whatever' } %> # # @option *args :label [String, Symbol] # Override the label text with a String or a symbold for an i18n translation key # # @option *args :button_html [Hash] # Override or add to the HTML attributes to be passed down to the `` tag # # @option *args :wrapper_html [Hash] # Override or add to the HTML attributes to be passed down to the wrapping `
  • ` tag # # @todo document i18n keys def action(method, options = {}) options = options.dup # Allow options to be shared without being tainted by Formtastic options[:as] ||= default_action_type(method, options) klass = action_class(options[:as]) klass.new(self, template, @object, @object_name, method, options).to_html end protected def default_action_type(method, options = {}) #:nodoc: case method when :submit then :input when :reset then :input when :cancel then :link end end def action_class(as) @input_classes_cache ||= {} @input_classes_cache[as] ||= begin begin begin custom_action_class_name(as).constantize rescue NameError standard_action_class_name(as).constantize end rescue NameError raise Formtastic::UnknownActionError end end end # :as => :button # => ButtonAction def custom_action_class_name(as) "#{as.to_s.camelize}Action" end # :as => :button # => Formtastic::Actions::ButtonAction def standard_action_class_name(as) "Formtastic::Actions::#{as.to_s.camelize}Action" end end end end