Skip to main content
Code Review

Return to Revisions

1 of 3
ivann
  • 175
  • 7

Rails partial inheritance hack

I have a STI table and want to be able to render a collection using

render @collection 

with every elements of the collection using their own partial or, if they don't have one, the parent partial. You know, partial inheritance.

So I added to my parent model :

def to_partial_path
 self.class._to_partial_path
end
protected
# a little hack to get partial inheritance in views, check if the partial exist, if not
# return the parent's one. Provide class level cache, be sure to restart your app when
# adding/removing partials.
def self._to_partial_path
 @_to_partial_path ||= begin
 element = ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(self))
 collection = ActiveSupport::Inflector.tableize(self)
 if File.exists?(Rails.root.join('app', 'views', collection, "_#{element}.html.erb")) ||
 self.superclass == ActiveRecord::Base
 "#{collection}/#{element}"
 else
 self.superclass._to_partial_path
 end
 end
end

The original code is here.

This seems to work great so far but I want to have some opinions.

Should I have gone another way ?

Any gotcha I may find myself into using this ?

Any way to refactor this ?

ivann
  • 175
  • 7
lang-rb

AltStyle によって変換されたページ (->オリジナル) /