jquery-ui-form 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.rvmrc +1 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +109 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +25 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/jquery-ui-form.gemspec +149 -0
- data/lib/generators/jquery_ui_form/install/install_generator.rb +18 -0
- data/lib/generators/templates/jquery-ui-form.js +46 -0
- data/lib/generators/templates/jquery-ui-form.rb +5 -0
- data/lib/generators/templates/jquery-ui-form.sass +115 -0
- data/lib/jquery-ui-form.rb +1 -0
- data/lib/jquery_ui_form.rb +7 -0
- data/lib/jquery_ui_form/form_builder.rb +43 -0
- data/lib/jquery_ui_form/helpers.rb +17 -0
- data/lib/jquery_ui_form/helpers/button_helper.rb +39 -0
- data/lib/jquery_ui_form/helpers/error_helper.rb +39 -0
- data/lib/jquery_ui_form/helpers/form_helper.rb +19 -0
- data/lib/jquery_ui_form/helpers/input_helper.rb +145 -0
- data/lib/jquery_ui_form/helpers/label_helper.rb +33 -0
- data/lib/jquery_ui_form/helpers/wrapper_helper.rb +41 -0
- data/lib/jquery_ui_form/inputs.rb +20 -0
- data/lib/jquery_ui_form/inputs/boolean_input.rb +16 -0
- data/lib/jquery_ui_form/inputs/check_boxes_input.rb +75 -0
- data/lib/jquery_ui_form/inputs/date_input.rb +24 -0
- data/lib/jquery_ui_form/inputs/email_input.rb +12 -0
- data/lib/jquery_ui_form/inputs/file_input.rb +12 -0
- data/lib/jquery_ui_form/inputs/hidden_input.rb +11 -0
- data/lib/jquery_ui_form/inputs/number_input.rb +12 -0
- data/lib/jquery_ui_form/inputs/password_input.rb +11 -0
- data/lib/jquery_ui_form/inputs/phone_input.rb +12 -0
- data/lib/jquery_ui_form/inputs/radio_input.rb +33 -0
- data/lib/jquery_ui_form/inputs/range_input.rb +12 -0
- data/lib/jquery_ui_form/inputs/search_input.rb +12 -0
- data/lib/jquery_ui_form/inputs/select_input.rb +19 -0
- data/lib/jquery_ui_form/inputs/string_input.rb +11 -0
- data/lib/jquery_ui_form/inputs/text_input.rb +13 -0
- data/lib/jquery_ui_form/inputs/url_input.rb +12 -0
- data/lib/jquery_ui_form/railtie.rb +14 -0
- data/spec/form_helper_spec.rb +22 -0
- data/spec/helpers/button_helper_spec.rb +54 -0
- data/spec/helpers/error_helper_spec.rb +81 -0
- data/spec/helpers/input_helper_spec.rb +18 -0
- data/spec/helpers/label_helper_spec.rb +31 -0
- data/spec/helpers/wrapper_helper_spec.rb +73 -0
- data/spec/inputs/boolean_input_spec.rb +25 -0
- data/spec/inputs/check_boxes_input_spec.rb +39 -0
- data/spec/inputs/date_input_spec.rb +47 -0
- data/spec/inputs/email_input_spec.rb +24 -0
- data/spec/inputs/file_input_spec.rb +24 -0
- data/spec/inputs/hidden_input_spec.rb +24 -0
- data/spec/inputs/number_input_spec.rb +24 -0
- data/spec/inputs/password_input_spec.rb +23 -0
- data/spec/inputs/phone_input_spec.rb +24 -0
- data/spec/inputs/radio_input_spec.rb +39 -0
- data/spec/inputs/range_input_spec.rb +24 -0
- data/spec/inputs/search_input_spec.rb +24 -0
- data/spec/inputs/select_input_spec.rb +28 -0
- data/spec/inputs/string_input_spec.rb +24 -0
- data/spec/inputs/text_input_spec.rb +24 -0
- data/spec/inputs/url_input_spec.rb +24 -0
- data/spec/spec_helper.rb +63 -0
- metadata +272 -0
@@ -0,0 +1,5 @@
|
|
1
|
+
JqueryUiForm::FormBuilder.use_i18n = false
|
2
|
+
JqueryUiForm::FormBuilder.required_string = proc{"<abbr>*</abbr>"}
|
3
|
+
JqueryUiForm::FormBuilder.html5_inputs = true
|
4
|
+
JqueryUiForm::FormBuilder.placeholder_elements = %w(date email file number password phone search string text url)
|
5
|
+
JqueryUiForm::FormBuilder.use_autofocus = true
|
@@ -0,0 +1,115 @@
|
|
1
|
+
.ui-base-error-messages
|
2
|
+
@extend .ui-state-error
|
3
|
+
@extend .ui-corner-all
|
4
|
+
:margin 0px 0px 5px 0px
|
5
|
+
:padding 3px 5px 3px 5px
|
6
|
+
.ui-icon
|
7
|
+
:float left
|
8
|
+
:margin-right 3px
|
9
|
+
p
|
10
|
+
:padding-bottom 2px
|
11
|
+
.ui-form
|
12
|
+
@extend .ui-widget-content
|
13
|
+
@extend .ui-corner-all
|
14
|
+
.ui-fieldset
|
15
|
+
@extend .ui-widget-content
|
16
|
+
@extend .ui-corner-all
|
17
|
+
clear: both
|
18
|
+
padding: 10px
|
19
|
+
margin: 10px
|
20
|
+
.ui-fieldset
|
21
|
+
padding: 5px
|
22
|
+
margin-left: -5px
|
23
|
+
legend
|
24
|
+
padding: 3px 10px 3px 10px
|
25
|
+
margin-left: 10px
|
26
|
+
.ui-form-buttons
|
27
|
+
display: block
|
28
|
+
clear: both
|
29
|
+
padding: 5px 25px 5px 124px
|
30
|
+
text-align: left
|
31
|
+
.ui-button.ui-state-error
|
32
|
+
float: right
|
33
|
+
.ui-form-column
|
34
|
+
display: block
|
35
|
+
float: left
|
36
|
+
clear: both
|
37
|
+
margin-bottom: 5px
|
38
|
+
position: relative
|
39
|
+
width: 335px
|
40
|
+
&.ui-input-error input, &.ui-input-error textarea, &.ui-input-error select
|
41
|
+
//Taken from .ui-state-error-text
|
42
|
+
border-color: #cd0a0a
|
43
|
+
.ui-form-column
|
44
|
+
float: left
|
45
|
+
clear: none
|
46
|
+
.ui-form-row
|
47
|
+
float: left
|
48
|
+
clear: both
|
49
|
+
.ui-form-column
|
50
|
+
float: left
|
51
|
+
clear: none
|
52
|
+
.ui-form-column.ui-check_boxes-input
|
53
|
+
.ui-form-column
|
54
|
+
float: left
|
55
|
+
clear: none
|
56
|
+
.ui-form-row.ui-radio-input, .ui-form-column.ui-radio-input, .ui-form-row.ui-check_boxes-input, .ui-form-column.ui-check_boxes-input
|
57
|
+
clear: both
|
58
|
+
width: auto
|
59
|
+
.ui-form-row.ui-check_boxes-input, .ui-form-column.ui-check_boxes-input
|
60
|
+
clear: both
|
61
|
+
width: auto
|
62
|
+
.ui-form-column.ui-select-input, .ui-form-row.ui-select-input
|
63
|
+
height: 24px
|
64
|
+
.ui-form-column.ui-hidden-input, .ui-form-row.ui-hidden-input
|
65
|
+
display: none
|
66
|
+
.ui-fieldset.ui-buttonset
|
67
|
+
width: 100%
|
68
|
+
|
69
|
+
.ui-input-error-message
|
70
|
+
font-size: 80%
|
71
|
+
@extend .ui-state-error-text
|
72
|
+
text-align: right
|
73
|
+
font-style: italic
|
74
|
+
.ui-check_boxes-input .ui-input-error-message, .ui-radio-input .ui-input-error-message
|
75
|
+
margin-top: -7px
|
76
|
+
.ui-input-hint
|
77
|
+
position: absolute
|
78
|
+
top: 5px
|
79
|
+
left: 129px
|
80
|
+
font-size: 80%
|
81
|
+
opacity: .45
|
82
|
+
filter: Alpha(Opacity = 45)
|
83
|
+
.ui-check_boxes-input .ui-input-hint, .ui-radio-input .ui-input-hint
|
84
|
+
top: 27px
|
85
|
+
left: 21px
|
86
|
+
.ui-boolean-input .ui-input-hint
|
87
|
+
left: 139px
|
88
|
+
label
|
89
|
+
width: 120px
|
90
|
+
float: left
|
91
|
+
text-align: right
|
92
|
+
margin-right: 5px
|
93
|
+
margin-top: 4px
|
94
|
+
input.ui-string-input, input.ui-password-input, input.ui-email-input, input.ui-phone-input, input.ui-url-input, input.ui-search-input, input.ui-number-input, input.ui-file-input, input.ui-range-input, input.ui-date-input, input.ui-datetime-input, input.ui-time-input
|
95
|
+
width: 200px
|
96
|
+
padding: 2px
|
97
|
+
margin: 0px
|
98
|
+
line-height: 1.5em
|
99
|
+
input.ui-date-input
|
100
|
+
width: 100px
|
101
|
+
input.ui-range-input
|
102
|
+
margin-top: 2px
|
103
|
+
padding-bottom: 0px
|
104
|
+
input.ui-search-input
|
105
|
+
margin-top: 3px
|
106
|
+
textarea.ui-text-input
|
107
|
+
width: 200px
|
108
|
+
padding: 2px
|
109
|
+
margin: 0px
|
110
|
+
input.ui-boolean-input, input.ui-radio-input
|
111
|
+
margin: 7px 0px 5px 0px
|
112
|
+
select.ui-select-input
|
113
|
+
max-width: 200px
|
114
|
+
margin: 2px 0px 0px 0px
|
115
|
+
height: 22px
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'jquery_ui_form'
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module JqueryUiForm
|
2
|
+
class FormBuilder < ActionView::Helpers::FormBuilder
|
3
|
+
|
4
|
+
attr_accessor :template
|
5
|
+
attr_accessor :autofocus
|
6
|
+
|
7
|
+
def self.configure(name, value = nil)
|
8
|
+
class_attribute(name)
|
9
|
+
self.send(:"#{name}=", value)
|
10
|
+
end
|
11
|
+
|
12
|
+
configure :use_i18n, :true
|
13
|
+
configure :required_string, proc{"<abbr>*</abbr>"}
|
14
|
+
configure :html5_inputs, :true
|
15
|
+
configure :placeholder_elements, %w(date email password phone search string text url)
|
16
|
+
configure :use_autofocus, true
|
17
|
+
|
18
|
+
include JqueryUiForm::Helpers::WrapperHelper
|
19
|
+
include JqueryUiForm::Helpers::InputHelper
|
20
|
+
include JqueryUiForm::Helpers::ErrorHelper
|
21
|
+
include JqueryUiForm::Helpers::LabelHelper
|
22
|
+
include JqueryUiForm::Helpers::ButtonHelper
|
23
|
+
|
24
|
+
include JqueryUiForm::Inputs::StringInput
|
25
|
+
include JqueryUiForm::Inputs::PasswordInput
|
26
|
+
include JqueryUiForm::Inputs::BooleanInput
|
27
|
+
include JqueryUiForm::Inputs::SelectInput
|
28
|
+
include JqueryUiForm::Inputs::RadioInput
|
29
|
+
include JqueryUiForm::Inputs::CheckBoxesInput
|
30
|
+
include JqueryUiForm::Inputs::TextInput
|
31
|
+
include JqueryUiForm::Inputs::HiddenInput
|
32
|
+
include JqueryUiForm::Inputs::FileInput
|
33
|
+
# HTML5
|
34
|
+
include JqueryUiForm::Inputs::EmailInput
|
35
|
+
include JqueryUiForm::Inputs::PhoneInput
|
36
|
+
include JqueryUiForm::Inputs::UrlInput
|
37
|
+
include JqueryUiForm::Inputs::SearchInput
|
38
|
+
include JqueryUiForm::Inputs::NumberInput
|
39
|
+
include JqueryUiForm::Inputs::RangeInput
|
40
|
+
include JqueryUiForm::Inputs::DateInput
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module JqueryUiForm
|
2
|
+
module Helpers
|
3
|
+
autoload :FormHelper, 'jquery_ui_form/helpers/form_helper'
|
4
|
+
autoload :WrapperHelper, 'jquery_ui_form/helpers/wrapper_helper'
|
5
|
+
autoload :InputHelper, 'jquery_ui_form/helpers/input_helper'
|
6
|
+
|
7
|
+
autoload :LabelHelper, 'jquery_ui_form/helpers/label_helper'
|
8
|
+
autoload :TextFieldHelper, 'jquery_ui_form/helpers/text_field_helper'
|
9
|
+
autoload :PasswordFieldHelper, 'jquery_ui_form/helpers/password_field_helper'
|
10
|
+
autoload :CheckBoxHelper, 'jquery_ui_form/helpers/check_box_helper'
|
11
|
+
autoload :RadioButtonHelper, 'jquery_ui_form/helpers/radio_button_helper'
|
12
|
+
autoload :ButtonHelper, 'jquery_ui_form/helpers/button_helper'
|
13
|
+
autoload :SelectHelper, 'jquery_ui_form/helpers/select_helper'
|
14
|
+
|
15
|
+
autoload :ErrorHelper, 'jquery_ui_form/helpers/error_helper'
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module JqueryUiForm
|
2
|
+
module Helpers
|
3
|
+
module ButtonHelper
|
4
|
+
|
5
|
+
def button(name, options = {})
|
6
|
+
if use_i18n && !options.delete(:translate)
|
7
|
+
name = I18n.t(name)
|
8
|
+
elsif name == name.to_sym
|
9
|
+
name = name.to_s.upcase.humanize
|
10
|
+
end
|
11
|
+
(options[:class] ||= "") << " ui-button"
|
12
|
+
options[:type] ||= "submit"
|
13
|
+
|
14
|
+
if (icon = options.delete(:icon))
|
15
|
+
options["data-icon"] = "ui-icon-#{icon}"
|
16
|
+
end
|
17
|
+
template.content_tag(:button,name, options)
|
18
|
+
end
|
19
|
+
|
20
|
+
def submit(name=nil, options = {})
|
21
|
+
options.merge!(name) && name = nil if name.is_a?(Hash)
|
22
|
+
options[:type] ||= "submit"
|
23
|
+
options[:icon] ||= "check"
|
24
|
+
name ||= (@object && @object.respond_to?(:new_record?) && @object.new_record? ? :create : :update )
|
25
|
+
button(name, options)
|
26
|
+
end
|
27
|
+
|
28
|
+
def cancel(name=nil, options = {})
|
29
|
+
options.merge!(name) && name = nil if name.is_a?(Hash)
|
30
|
+
options[:type] ||= "reset"
|
31
|
+
options[:icon] ||= "close"
|
32
|
+
(options[:class] ||= "") << " ui-state-error"
|
33
|
+
name ||= :cancel
|
34
|
+
button(name, options)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module JqueryUiForm
|
2
|
+
module Helpers
|
3
|
+
module ErrorHelper
|
4
|
+
|
5
|
+
def has_errors?(method)
|
6
|
+
@object && @object.respond_to?(:errors) && !@object.errors[method.to_sym].blank?
|
7
|
+
end
|
8
|
+
|
9
|
+
def error_message_on(method)
|
10
|
+
@object.errors[method.to_sym]
|
11
|
+
end
|
12
|
+
|
13
|
+
def error_messages_on_base
|
14
|
+
@object.errors[:base]
|
15
|
+
end
|
16
|
+
|
17
|
+
def inline_error(method)
|
18
|
+
return "" unless has_errors?(method)
|
19
|
+
template.content_tag(:div, error_message_on(method), :class => "ui-input-error-message")
|
20
|
+
end
|
21
|
+
|
22
|
+
def model_errors(errors=[])
|
23
|
+
errors = error_messages_on_base.to_a + errors.to_a
|
24
|
+
return "" if errors.empty?
|
25
|
+
template.content_tag(:div, :class => "ui-base-error-messages") do
|
26
|
+
errors.each do |message|
|
27
|
+
template.concat(
|
28
|
+
template.content_tag(:p) do
|
29
|
+
template.concat(template.content_tag(:span, "", :class => "ui-icon ui-icon-alert"))
|
30
|
+
template.concat(template.content_tag(:strong, message))
|
31
|
+
end
|
32
|
+
)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module JqueryUiForm
|
2
|
+
module Helpers
|
3
|
+
module FormHelper
|
4
|
+
|
5
|
+
def jquery_form_for(name, *args, &block)
|
6
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
7
|
+
options[:builder] ||= JqueryUiForm::FormBuilder
|
8
|
+
options[:html] ||= {}
|
9
|
+
(options[:html][:class] ||= "") << " ui-form"
|
10
|
+
form_for(name, *(args << options), &block)
|
11
|
+
end
|
12
|
+
|
13
|
+
# def form_for(name, *args, &block)
|
14
|
+
# super(name, *args, &block)
|
15
|
+
# end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
module JqueryUiForm
|
2
|
+
module Helpers
|
3
|
+
module InputHelper
|
4
|
+
|
5
|
+
def input(method, options={})
|
6
|
+
row_options = options.delete(:html_row) || {}
|
7
|
+
|
8
|
+
options[:as] ||= default_input_type(method, options)
|
9
|
+
options[:required] ||= method_required?(method)
|
10
|
+
|
11
|
+
row_options[:class] ||= ""
|
12
|
+
row_options[:class] << " ui-#{options[:as]}-input"
|
13
|
+
|
14
|
+
options[:class] ||= ""
|
15
|
+
options[:class] << " ui-#{options[:as]}-input"
|
16
|
+
options[:class] << " ui-input-error" if has_errors?(method)
|
17
|
+
if use_autofocus && (!self.autofocus)
|
18
|
+
options[:autofocus] = true
|
19
|
+
self.autofocus = true
|
20
|
+
end
|
21
|
+
column(row_options) do
|
22
|
+
send(:"#{options.delete(:as)}_input", method, options)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def basic_input_helper(form_helper_method, type, method, options) #:nodoc:
|
27
|
+
label_options = options.delete(:html_label) || {}
|
28
|
+
label_options[:required] = options[:required]
|
29
|
+
label_options[:label] = options.delete(:label)
|
30
|
+
hint = options[:placeholder] = options.delete(:hint)
|
31
|
+
label(method, label_options) <<
|
32
|
+
send(respond_to?(form_helper_method) ? form_helper_method : :text_field, method, options) <<
|
33
|
+
inline_hint(hint, type) <<
|
34
|
+
inline_error(method)
|
35
|
+
end
|
36
|
+
|
37
|
+
def inline_hint(hint, type = nil)
|
38
|
+
return "" if hint.blank?
|
39
|
+
if use_i18n
|
40
|
+
hint = I18n.t(hint,:scope => [:helpers, :hints])
|
41
|
+
end
|
42
|
+
return "" if html5_inputs && placeholder_elements.include?(type.to_s)
|
43
|
+
template.content_tag(:div, hint, :class => "ui-input-hint")
|
44
|
+
end
|
45
|
+
|
46
|
+
protected
|
47
|
+
|
48
|
+
# Determins if the attribute should be considered required or not.
|
49
|
+
#
|
50
|
+
# * if the :required option isn't provided in the options hash, and the object is
|
51
|
+
# an ActiveModel, true is returned
|
52
|
+
# if the validates_presence_of macro has been used in the class for this attribute, or false
|
53
|
+
# otherwise.
|
54
|
+
def method_required?(attribute) #:nodoc:
|
55
|
+
attribute_sym = attribute.to_s.sub(/_id$/, '').to_sym
|
56
|
+
if @object && @object.class.respond_to?(:validators_on)
|
57
|
+
!@object.class.validators_on(attribute_sym).find{|validator| (validator.kind == :presence || validator.kind == :inclusion) && (validator.options.present? ? options_require_validation?(validator.options) : true)}.nil?
|
58
|
+
else
|
59
|
+
false
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Determines whether the given options evaluate to true
|
64
|
+
def options_require_validation?(options) #nodoc
|
65
|
+
allow_blank = options[:allow_blank]
|
66
|
+
return !allow_blank unless allow_blank.nil?
|
67
|
+
if_condition = !options[:if].nil?
|
68
|
+
condition = if_condition ? options[:if] : options[:unless]
|
69
|
+
|
70
|
+
condition = if condition.respond_to?(:call)
|
71
|
+
condition.call(@object)
|
72
|
+
elsif condition.is_a?(::Symbol) && @object.respond_to?(condition)
|
73
|
+
@object.send(condition)
|
74
|
+
else
|
75
|
+
condition
|
76
|
+
end
|
77
|
+
|
78
|
+
if_condition ? !!condition : !condition
|
79
|
+
end
|
80
|
+
|
81
|
+
def default_input_type(method, options)
|
82
|
+
if column = column_for(method)
|
83
|
+
# Special cases where the column type doesn't map to an input method.
|
84
|
+
case column.type
|
85
|
+
when :string
|
86
|
+
return :password if method.to_s =~ /password/
|
87
|
+
if html5_inputs
|
88
|
+
return :search if method.to_s =~ /^search$/
|
89
|
+
return :phone if method.to_s =~ /^phone$|fax$|mobile/
|
90
|
+
return :url if method.to_s =~ /^url$|^website$|_url$/
|
91
|
+
return :email if method.to_s =~ /email/
|
92
|
+
# return :date if method.to_s =~ /date$/
|
93
|
+
end
|
94
|
+
when :integer
|
95
|
+
return :select unless options.key?(:collection)
|
96
|
+
return :number
|
97
|
+
when :float, :decimal
|
98
|
+
return :number
|
99
|
+
when :timestamp
|
100
|
+
return :datetime
|
101
|
+
when :date
|
102
|
+
return :date
|
103
|
+
when :text
|
104
|
+
return :text
|
105
|
+
end
|
106
|
+
|
107
|
+
# Try look for hints in options hash. Quite common senario: Enum keys stored as string in the database.
|
108
|
+
return :select if column.type == :string && options.key?(:collection)
|
109
|
+
# Try 3: Assume the input name will be the same as the column type (e.g. string_input).
|
110
|
+
return column.type
|
111
|
+
else
|
112
|
+
if @object
|
113
|
+
return :select if reflection_for(method)
|
114
|
+
end
|
115
|
+
|
116
|
+
return :select if options.key?(:collection)
|
117
|
+
return :password if method.to_s =~ /password/
|
118
|
+
return :text if method.to_s =~ /notes/
|
119
|
+
return :file if method.to_s =~ /attachment/
|
120
|
+
if html5_inputs
|
121
|
+
return :email if method.to_s =~ /email/
|
122
|
+
return :phone if method.to_s =~ /^phone$|fax$|mobile/
|
123
|
+
return :url if method.to_s =~ /^url$|^website$|_url$/
|
124
|
+
return :search if method.to_s =~ /^search$/
|
125
|
+
return :number if method.to_s =~ /^amount|size/
|
126
|
+
end
|
127
|
+
return :string
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
# Get a column object for a specified attribute method - if possible.
|
132
|
+
def column_for(method) #:nodoc:
|
133
|
+
@object.column_for_attribute(method) if @object.respond_to?(:column_for_attribute)
|
134
|
+
end
|
135
|
+
|
136
|
+
def reflection_for(method) #:nodoc:
|
137
|
+
@object.class.reflect_on_association(method) if @object.class.respond_to?(:reflect_on_association)
|
138
|
+
end
|
139
|
+
|
140
|
+
def name_to_id(name)
|
141
|
+
name.to_s.gsub(/\s/, "_").gsub(/\W/, "").gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "").downcase
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|