lib/active_ldap/helper.rb in activeldap-1.0.9 vs lib/active_ldap/helper.rb in activeldap-1.1.0
- old
+ new
@@ -27,7 +27,66 @@
def ldap_syntax_description_gettext(syntax)
Base.human_syntax_description(syntax)
end
alias_method(:lsd_, :ldap_syntax_description_gettext)
+
+ def ldap_field(type, object_name, method, options={})
+ case type
+ when "radio_button", "check_box", "text_area"
+ form_method = type
+ else
+ form_method = "#{type}_field"
+ end
+
+ object = options[:object]
+ if object.nil?
+ normalized_object_name = object_name.to_s.sub(/\[\](\])?$/, "\\1")
+ object = instance_variable_get("@#{normalized_object_name}")
+ end
+ values = object.nil? ? nil : object[method, true]
+ values = [nil] if values.blank?
+ required_ldap_options = options.delete(:ldap_options) || []
+ required_ldap_options.each do |required_ldap_option|
+ found = false
+ values.each do |value|
+ next unless value.is_a?(Hash)
+ if Hash.to_a[0].to_s == required_ldap_option.to_s
+ found = true
+ break
+ end
+ end
+ values << {required_ldap_option => ""} unless found
+ end
+
+ fields = []
+ collect_values = Proc.new do |value, ldap_options|
+ case value
+ when Hash
+ value.each do |k, v|
+ collect_values.call(v, ldap_options + [k])
+ end
+ when Array
+ value.each do |v|
+ collect_values.call(v, ldap_options)
+ end
+ else
+ id = "#{object_name}_#{method}"
+ name = "#{object_name}[#{method}][]"
+ ldap_options.collect.each do |ldap_option|
+ id << "_#{ldap_option}"
+ name << "[#{ldap_option}][]"
+ end
+ ldap_value_options = {:id => id, :name => name, :value => value}
+ field = send(form_method, object_name, method,
+ ldap_value_options.merge(options))
+ if block_given?
+ field = yield(field, {:options => ldap_options, :value => value})
+ end
+ fields << field unless field.blank?
+ end
+ end
+ collect_values.call(values, [])
+ fields.join("\n")
+ end
end
end