module Shaf::Formable

Public Class Methods

add_class_reader(clazz, name, form) click to toggle source
# File lib/shaf/formable.rb, line 5
def self.add_class_reader(clazz, name, form)
  clazz.define_singleton_method(name) { form }
end
add_instance_reader(clazz, name, form, prefill) click to toggle source
# File lib/shaf/formable.rb, line 9
def self.add_instance_reader(clazz, name, form, prefill)
  clazz.define_method(name) do
    form.tap do |f|
      f.resource = self
      f.fill! if prefill
    end
  end
end

Public Instance Methods

form(&block) click to toggle source

Deprecated legacy way of specifying forms inside models

# File lib/shaf/formable.rb, line 19
    def form(&block)
      forms_for(self, &block)

      Shaf.log.info <<~MSG


        DEPRECATED method ::form in #{self}
        Declare forms in a separate class extending Shaf::Formable with the class method forms_for!
      MSG
    end
form_for(clazz, &block)
Alias for: forms_for
forms_for(clazz, &block) click to toggle source

New way of writing forms in a separate class/file

# File lib/shaf/formable.rb, line 31
def forms_for(clazz, &block)
  builder = Formable::Builder.new(&block)
  builder.forms.each do |form|
    next unless form.action
    method_name = "#{form.action}_form"

    Formable.add_class_reader(clazz, method_name, form.dup)

    if instance_accessor = builder.instance_accessor_for(form)
      prefill_form = instance_accessor.prefill?
      Formable.add_instance_reader(clazz, method_name, form.dup, prefill_form)
    end
  end
end
Also aliased as: form_for