There is a  silent failure to render
that occurs when the value of self.this
is assigned to an Array in a controller index action.

e.g.  This fails to render anything useful:

def index
   a = User.where(active: true).to_a.paginate
   self.this = a
   hobo_index
end

(Before you go telling me to just skip calling to_a, understand that this 
is simply an example.  My own application which is more complex needs for 
the list of users to be an array)

Apparently, a workaround gleaned from an old thread on this
topic from 2011 is to extend the Array with a member_class method
that returns the class of the items in the Array.

e.g.

def index
   a = User.where(active: true).to_a.paginate
   
   def a.member_class
     first.class rescue nil
   end

   self.this = a
   hobo_index
end

While this workaround my index action going again, I don't like the idea of 
each Hobo user having to discover
and diagnose this gotcha over and over again.

I'd like to submit a permanent automatic solution to this problem as a Hobo 
PR but first
I'd like to get some opinions on the best strategy.

Possible strategies I've identified:
  1.  Monkey patch Enumerable with member_class
         Advantages
           * comprehensive
           * quick and easy
         Disadvantages
           * it is widely frowned-upon to monkey patch core modules
           * may have unanticipated detrimental side-effects

  2. Change Hobo::Controller::Model::hobo_index to check if self.this is an 
Array that does
       not respond to member_class and if so, decorate or extend it with 
member_class just
       before calling response_block
         Advantages
           * more limited impact than patching Enumerable
         Disadvantages
           * does not address any other situations where dryml tags assume 
that all valid collections respond_to member_class

  3.  Find all references to member_class in the dryml taglibs and make 
each and every one of them check to see
       if self.this is an Array and if so, use self.this.first.class rather 
than self.this.member_class
         Advantages
           * does not surprise anyone because no object or class is being 
changed or wrapped dynamically
         Disadvantages
           * a lot more work
           * if people define more tags, they may introduce this problem 
all over again.


Any other suggestions?


-- 
You received this message because you are subscribed to the Google Groups "Hobo 
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/hobousers.
For more options, visit https://groups.google.com/d/optout.

Reply via email to