Module: CoolNestedFormsHelper

Defined in:
app/helpers/cool_nested_forms_helper.rb

Instance Method Summary collapse

Instance Method Details

#new_entry_button(name, association, options = {}) ⇒ Object

new_entry_button ## arguments

  • name: A string to be displayed as the button text

  • association: a model class i.e. MyTask

  • target: a html tag ID where the button will be attached

  • options: hash of override options

    • plurilized: the plural version of the model name

    • js_template_name: name for the javascript variable generated by this method ( useful when there are multiple nested associations)

    • class: a string with any css class names to be used for styling

    • style: a string with any css styles

    • child_js_template_names: an array with any children js template names. every time a nested association that contains other nested associations is added, a button to add a child entry is added to the new entry

    • tag: override the returned tag

    • tag_content: override the returned tag content



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'app/helpers/cool_nested_forms_helper.rb', line 62

def new_entry_button(name, association, options = {})
  options[:pluralized] ||= association.name.underscore.pluralize
  options[:js_template_name] ||= association.name.underscore.pluralize
  options[:class] ||= ""
  options[:style] ||= ""
  options[:child_js_template_names] ||= ""
  options[:tag] ||= :span
  options[:tag_content] ||= "<span>#{name}</span>"
  options[:target] ||= association.name.underscore.pluralize

  return (options[:tag],
    options[:tag_content].html_safe,
    :class => "cnf-add-entry #{options[:class]}",
    :style => options[:style],
    "data-association" => options[:pluralized],
    "data-js-template-name" => options[:js_template_name],
    "data-child-js-template-names" => options[:child_js_template_names],
    :id => "#{options[:js_template_name]}_button",
    "data-target" => options[:target])
end

#new_entry_template(builder, association, options = {}) ⇒ Object

new_entry_template ## arguments

  • builder: a FormBuilder Object obtained from form_with or form_for

  • association: a model class i.e. MyTask

  • options: hash of override options

    • partial: name of the erb partial to use as a tempalte

    • id: ID to be used in for the container

    • plurilized: the plural version of the model name

    • js_template_name: name for the javascript variable generated by this method ( useful when there are multiple nested associations)

    • children: an array with childre association options for nested association of a nested association



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'app/helpers/cool_nested_forms_helper.rb', line 13

def new_entry_template(builder,association, options = {})
  # initialize options
  options[:partial] ||= association.name.underscore
  options[:id] ||= "#{association.name.underscore}_[tempid]"
  options[:pluralized] ||= association.name.underscore.pluralize
  options[:js_template_name] ||= association.name.underscore.pluralize
  options[:children] ||= []

  # children output
  children_output = ''
  # render the template using the form builder object and the association
  output = builder.fields_for(options[:pluralized],association.new, :child_index => "new_#{options[:pluralized]}") do |assoc_builder|

    # render each children
    options[:children].each do |child|
      children_output += new_entry_template(assoc_builder,child[:association],child)
    end

    # render erb partial
    render(:partial=>options[:partial],:locals =>{:builder => assoc_builder, :id => options[:id] })
  end

  # remove any new line characters
  output = output.gsub( /\r?\n|\r/, ' ')

  # create the script tag that will be output to the page
  script_tag = "<script> var #{options[:js_template_name]} = '#{output}'; </script>"

  # add children_output
  script_tag += children_output
  # return the output as html safe
  return script_tag.html_safe
end

#remove_entry_button(name, association, options = {}) ⇒ Object

remove_entry_button arguments

  • name: A string to be displayed as the button text

  • target: a html tag ID that contains the element to be removed

  • options: hash of override options

    • class: a string with any css class names to be used for styling

    • style: a string with any css styles

    • tag: override the returned tag

    • tag_content: override the returned tag content



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'app/helpers/cool_nested_forms_helper.rb', line 92

def remove_entry_button(name, association, options = {})
  options[:class] ||= ''
  options[:style] ||= ''
  options[:tag] ||= :div
  options[:tag_content] ||= "<span>#{name}</span>"
  options[:target] ||= ""

  return (
    options[:tag],
    options[:tag_content].html_safe,
    :style => options[:style],
    :class => "cnf-remove-entry #{options[:class]}",
    "data-target" => options[:target]
  )
end