我有一个数据模型,其中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>
。但是,我没有在第一种情况下得到这个错误。有什么想法吗?
答案 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