Module: Sequel::Plugins::Forme::SequelForm

Included in:
Form
Defined in:
lib/sequel/plugins/forme.rb

Overview

This module extends all Forme::Form instances that use a Sequel::Model instance as the form’s obj.

Instance Method Summary collapse

Instance Method Details

#form(attr = {}, &block) ⇒ Object

Use the post method by default for Sequel forms, unless overridden with the :method attribute.



22
23
24
25
# File 'lib/sequel/plugins/forme.rb', line 22

def form(attr={}, &block)
  attr[:class] = ::Forme.merge_classes(attr[:class], "forme", obj.forme_namespace)
  super(attr, &block)
end

#humanize(s) ⇒ Object

Call humanize on a string version of the argument if String#humanize exists. Otherwise, do some monkeying with the string manually.



30
31
32
33
# File 'lib/sequel/plugins/forme.rb', line 30

def humanize(s)
  s = s.to_s
  s.respond_to?(:humanize) ? s.humanize : s.gsub(/_id$/, "").gsub(/_/, " ").capitalize
end

#subform(association, opts = {}, &block) ⇒ Object

Handle nested association usage. The association should be a name of the association for the form’s obj. Inside the block, calls to the input and inputs methods for the receiver treat the associated object as the recevier’s obj, using name and id attributes that work with the Sequel nested_attributes plugin. Returns the HTML generated by the subform.

The following options are currently supported:

:inputs

Automatically call inputs with the given values. Using this, it is not required to pass a block to the method, though it will still work if you do.

:inputs_opts

When using the :grid option, this allows you to specify options to pass to the table InputsWrapper.

:legend

Overrides the default :legend used (which is based on the association name). You can also use a proc as the value, which will called with each associated object (and the position in the associated object already for *_to_many associations), and should return the legend string to use for that object.

:grid

Sets up a table with one row per associated object, and one column per field.

:labels

When using the :grid option, override the labels that would be created via the :inputs option. If you are not providing an :inputs option or are using a block with additional inputs, you should specify this option.

:skip_primary_key

Skip adding a hidden primary key field for existing objects.



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/sequel/plugins/forme.rb', line 61

def subform(association, opts={}, &block)
  content_added do
    nested_obj = opts.has_key?(:obj) ? opts[:obj] : obj.send(association)
    ref = obj.class.association_reflection(association)
    multiple = ref.returns_array?
    grid = opts[:grid]
    ns = "#{association}_attributes"

    send(multiple ? :each_obj : :with_obj, nested_obj, ns) do |no, i|
      input(ref.associated_class.primary_key, :type=>:hidden, :label=>nil, :wrapper=>nil) unless no.new? || opts[:skip_primary_key]
    end

    contents = proc do
      send(multiple ? :each_obj : :with_obj, nested_obj, ns) do |no, i|
        options = opts.dup
        if grid
          options.delete(:legend)
        else
          if options.has_key?(:legend)
            if options[:legend].respond_to?(:call)
              options[:legend] = multiple ? options[:legend].call(no, i) : options[:legend].call(no)
            end
          else
            if multiple
              options[:legend] = humanize("#{obj.model.send(:singularize, association)} ##{i+1}")
            else
              options[:legend] = humanize(association)
            end
          end
        end
        options[:subform] = true

        inputs(options[:inputs]||[], options, &block)
      end
    end
    
    if grid
      labels = opts.fetch(:labels){opts[:inputs].map{|l,| humanize(l)} if opts[:inputs]}
      legend = opts.fetch(:legend){humanize(association)}
      inputs_opts = opts[:inputs_opts] || {}
      inputs(inputs_opts.merge(:inputs_wrapper=>:table, :nested_inputs_wrapper=>:tr, :wrapper=>:td, :labeler=>nil, :labels=>labels, :legend=>legend), &contents)
    else
      contents.call
    end
  end
end