Sanity for free
Just an experiment.
1 2 3 4 5 6 7 8 9 10 11 12 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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
require 'erb' class ActionView::Base def _copy_ivars_from_controller_with_sanity variables = _copy_ivars_from_controller_without_sanity variables.each do |v| ivar = instance_variable_get(v) if ivar.is_a?(Array) values = ivar.map do |subivar| subivar.respond_to?(:to_sanity) ? subivar.to_sanity : subivar end instance_variable_set(v, values) elsif ivar.respond_to?(:to_sanity) instance_variable_set(v, ivar.to_sanity) end end end alias_method_chain :_copy_ivars_from_controller, :sanity end module Sanity class Cleaner Object.instance_methods.each do |m| delegate m, :to => :@model unless m =~ /^__/ end def initialize(model) @model = model end def method_missing(method_id, *arguments, &block) if @model.class.sanitizable_columns.include?(method_id) value = @model.send(method_id) arguments.first == false ? value : ERB::Util.h(value) else @model.send(method_id, *arguments, &block) end end end module Model def self.included(base) base.send :include, InstanceMethods base.send :extend, ClassMethods end module InstanceMethods def to_sanity Cleaner.new(self) end end module ClassMethods def sanitizable_columns @sanitizable_columns ||= content_columns.find_all {|c| c.text? }.map(&:name).map(&:to_sym) end end end end ActiveRecord::Base.send :include, Sanity::Model |
And then..
1 2 |
<%= @item.name # sanitized name %> <%= @item.name(false) # unsanitized name %> |
I know, too many methods are missing, edge cases and what not. But hey, it’s just an idea/experiment.
Images:


Recent comments
1 year 23 weeks ago
1 year 23 weeks ago
1 year 25 weeks ago
1 year 27 weeks ago
1 year 42 weeks ago
1 year 45 weeks ago
1 year 45 weeks ago
1 year 45 weeks ago
1 year 46 weeks ago
1 year 48 weeks ago