3

我有一个数据模型,其中 aUser可以喜欢 aProject, 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>。但是,在第一种情况下我没有收到此错误。有任何想法吗?

4

3 回答 3

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,您不需要传入 an,:object因为您已经在使用 object 进行迭代的范围内r

于 2012-06-26T21:33:32.770 回答
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
于 2012-06-27T09:59:37.747 回答
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

使用此解决方案,您不必在每次添加另一个多态关系时更新此文件。你只需要确保新对象有一个名为的 rabl 模板show.json.rabl

于 2014-08-22T13:27:39.313 回答