使用多态模型渲染RABL部分

时间:2012-06-26 12:32:37

标签: ruby-on-rails-3 rabl

我有一个数据模型,其中User可以像Project, Suggestion, Comment或其他对象。 模型设置正确,如果我们只是为了支持likes/show.rabl孩子而Project有效

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

但是,我希望能够根据suggestions/show, comments/show使用target_type的部分内容。

我尝试了这个,但它不起作用:

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

我得到undefined method target for <Rabl::Engine:0x69fb988>。但是,我没有在第一种情况下得到这个错误。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您是否尝试过使用extends代替partial

也许你可以试试这样的东西?

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

在这种情况下,当您使用extends时,您无需传入:object,因为您已经在使用对象r进行迭代。

答案 1 :(得分:3)

这就是我最终使用的结果。

感谢此帖:https://github.com/nesquena/rabl/issues/273#issuecomment-6580713

child :target do
  node 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

答案 2 :(得分:1)

还有另一种方法可以做到这一点,你不必列出所有可能的多态关系。它可能有点hacky,但它确实有效。

像这样:

child :target do |u|
  # The regexp snippet selects everything from the last / and to the end
  extends u.to_partial_path.gsub(/\/([^\/]+)$/, '/show')
end

这会使用您对象的.to_partial_path。如果您的对象被调用Suggestion,则.to_partial_path将返回suggestions/suggestion。这就是为什么我使用gsub()来替换//show之后的所有内容。

使用此解决方案,每次添加其他多态关系时都不必更新此文件。您只需确保新对象具有名为show.json.rabl

的rabl模板