lib/data_tables.rb in data_tables-0.1.25 vs lib/data_tables.rb in data_tables-0.1.26
- old
+ new
@@ -400,27 +400,49 @@
end
# gets the value for a column and row
def datatables_instance_get_value(instance, column)
if column[:special]
- special = column[:special]
-
- if special[:method]
- return method(special[:method].to_sym).call(instance)
- elsif special[:eval]
- proc = lambda { obj = instance; binding }
- return Kernel.eval(special[:eval], proc.call)
- end
+ get_instance_special_value(instance, column[:special])
elsif column[:attribute]
- val = instance.send(column[:attribute].to_sym)
- if !val.blank? || val == false
- trans = I18n.t(val.to_s.to_sym, :default => val.to_s)
- return trans.class == String ? trans : val.to_s
- else
- return ''
+ begin
+ get_instance_value(instance.send("#{column[:attribute]}"))
+ rescue ArgumentError => error
+ handle_argument_error(error, instance, column)
end
+ else
+ return "value not found"
end
- return "value not found"
+ end
+
+ def get_instance_special_value(instance, special)
+ if special[:method]
+ return method(special[:method].to_sym).call(instance)
+ elsif special[:eval]
+ proc = lambda { obj = instance; binding }
+ return Kernel.eval(special[:eval], proc.call)
+ end
+ end
+
+ def get_instance_value(value)
+ if !value.blank? || value == false
+ trans = I18n.t(value.to_s.to_sym, :default => value.to_s)
+ return trans.class == String ? trans : value.to_s
+ else
+ return ''
+ end
+ end
+
+ def handle_argument_error(error, instance, column)
+ if error.message.include? "UTF-8"
+ invalid_sequence = instance.send("#{column[:attribute]}").bytes.to_a
+ logger.warn("[datatables] Error: #{instance.class.name} for "+
+ "id #{instance.id}, column #{column[:attribute]}: " +
+ "Invalid UTF8 sequence is [#{invalid_sequence.join(", ")}]")
+ return ''
+ else
+ raise
+ end
end
def datatable_source(name)
{:action => name, :attrs => method("datatable_#{name}_columns".to_sym).call}
end