Module: Para::FormBuilder::NestedForm

Defined in:
lib/para/form_builder/nested_form.rb

Instance Method Summary collapse

Instance Method Details

#allow_destroy?Boolean

Returns:

  • (Boolean)


50
51
52
53
54
55
56
# File 'lib/para/form_builder/nested_form.rb', line 50

def allow_destroy?
  return false unless nested?

  nested_options = parent_object.nested_attributes_options
  relation = nested_options[nested_attribute_name]
  relation && relation[:allow_destroy]
end

#inverse_of?(field_name) ⇒ Boolean

Returns:

  • (Boolean)


58
59
60
61
62
63
# File 'lib/para/form_builder/nested_form.rb', line 58

def inverse_of?(field_name)
  return false unless nested?

  reflection = parent_object.class.reflect_on_association(nested_attribute_name)
  reflection && (reflection.options[:inverse_of].to_s == field_name.to_s)
end

#nested?Boolean

Returns:

  • (Boolean)


65
66
67
# File 'lib/para/form_builder/nested_form.rb', line 65

def nested?
  nested_attribute_name.present? && options[:parent_builder]
end

#nested_attribute_nameObject



69
70
71
72
73
74
# File 'lib/para/form_builder/nested_form.rb', line 69

def nested_attribute_name
  options[:nested_attribute_name] ||=
    if (match = object_name.match(/\[(\w+)_attributes\]/))
      match[1]
    end
end

#nested_fieldsObject

FIXME : When we have a nested field that maps to an STI model, the _id

field is passed instead of the relation, and the inverse_of
guard doesn't work


8
9
10
11
12
# File 'lib/para/form_builder/nested_form.rb', line 8

def nested_fields
  @nested_fields ||= fields.reject do |field|
    inverse_of?(field.name)
  end
end

#nested_fields_partial_nameObject

Returns the partial name to be looked up for rendering used inside the nested fields partials, for the nested fields container and the remote nested fields partial.



84
85
86
# File 'lib/para/form_builder/nested_form.rb', line 84

def nested_fields_partial_name
  :fields
end

#nested_resource_dom_idObject



27
28
29
30
31
32
33
34
35
# File 'lib/para/form_builder/nested_form.rb', line 27

def nested_resource_dom_id
  return '' unless nested?

  @nested_resource_dom_id ||= [
    object.class.model_name.singular,
    (Time.now.to_f * 1000).to_i,
    object.id || "_new_#{nested_attribute_name}_id"
  ].join('-')
end

#nested_resource_nameObject



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/para/form_builder/nested_form.rb', line 14

def nested_resource_name
  @nested_resource_name ||= begin
    name_method = Para.config.resource_name_methods.find do |method_name|
      object.respond_to?(method_name) && object.try(method_name).present?
    end

    name = (name_method && object.send(name_method)) || default_resource_name
    name = name.to_s.gsub(%r{(</p>|<br\s*/?>)}, ' ')

    template.sanitize(name, tags: [])
  end
end

#parent_objectObject



76
77
78
# File 'lib/para/form_builder/nested_form.rb', line 76

def parent_object
  nested? && options[:parent_builder].object
end

#remove_association_button(allow_destroy_if:) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/para/form_builder/nested_form.rb', line 37

def remove_association_button(allow_destroy_if:)
  return '' unless allow_destroy?
  return '' unless !allow_destroy_if || allow_destroy_if.call(object)

  template.(:div, class: 'panel-btns') do
    template.link_to_remove_association(
      self, wrapper_class: 'form-fields', class: 'btn btn-danger btn-xs'
    ) do
      ::I18n.t('para.form.nested.remove')
    end
  end
end