Search code examples
ruby-on-rails-3rabl

Render RABL partials with polymorphic models


I have a data model where a User can like a Project, Suggestion, Comment, or other objects. The models are set up correctly, and likes/show.rabl works if we were just to support the Project child

object @like
attributes :id, :created_at, :target_type, :target_id, :user_id
child :user => :user do
  extends "users/show"
end
child :target do
  node do |project|
    partial('projects/show', :object => project)
  end
end

However, I want to be able to use partials of suggestions/show, comments/show as well depending on target_type.

I tried this but it's not working:

child :target do |u|
  u.target.map do |r|
    if r.is_a?(Suggestion)
      partial("suggestions/show", :object => r)
    elsif r.is_a?(Project)
      partial("projects/show", :object => r)
    end
  end
end

I get undefined method target for <Rabl::Engine:0x69fb988>. However, I don't get this error in the first case. Any ideas?


Solution

  • Have you tried using extends instead of partial?

    Perhaps you could try something like this?

    child :target do |u|
      u.target.map do |r|
        if r.is_a?(Suggestion)
          extends "suggestions/show"
        elsif r.is_a?(Project)
          extends "projects/show"
        end
      end
    end
    

    In this case, when you use extends, you don't need to pass in an :object because you're already in the scope of iterating through with the object r.