Rendering partials dynamically in Rails 3
You can override ActiveModel#to_partial_path if you want - same as how you might override to_param. See the documentation (and be sure to check the source too - they're doing some caching that's elided in the docs, but might be worth looking in to).

Anyway, in your case, you could likely just redefine the method on the User model like so:

# in app/models/user.rb
class User &lt; ActiveRecord::Base
  # ...
  def to_partial_path
    collection = ActiveSupport::Inflector.tableize(self)
    "#{collection}/#{self.role}"
  end
end


This way, you can use render as you would normally. You'll only be doing what Rails is already doing - just a little differently.