我正在寻找其他人通常如何组织他们的偏好来获取多态资源。
示例:
我Image
是多态的,根据imageable
的内容,我希望显示的内容略有不同。
我有一个部分images/_image
,可以致电render imageable.images
。我目前的心态是让我的图像部分检查imageable
是什么类型,然后有另一部分,特定于该情况。我的组织将有以下几点:
images/
_image.html.haml
_product.html.haml
_post.html.haml
_user.html.haml
我的_image
部分看起来像是:
%div
= render :partial => "images/#{imageable.type}"
这看起来是一种糟糕的做法,还是采取了错误的做法?我认为从任何地方拨打render imageable.images
比在整个地方拨打render :partial => ...
要好得多。
任何想法都将不胜感激。你是怎么做到的?
编辑:很长一段时间过去了,我仍然想知道是否有人对此有任何意见。抛出赏金,看看是否引起了一些注意。答案 0 :(得分:2)
现在,您的代码中不清楚_product
实际上是_image
。
我认为Rails的目的是这样做:
shared/
_image.html.haml
imageable/
_product.html.haml
_post.html.haml
_user.html.haml
然后在您调用的_image
部分中:
render :partial => imageable/#{image.type}", :image => image
现在从您的目录结构中可以清楚地知道您的多态性是什么。
(注意:我使用了shared
目录,但是当你的图像部分实际上没有在视图之间共享时,它应该在某个视图目录中,就像你实际上有一个images_controller
目录一样被称为images
)
答案 1 :(得分:2)
我认为你有正确的方法,但我认为清洁的最后一步是消除选择另一部分的图像部分,而不是将该行为传递给帮助者。类似......
module ImagesHelper
def show_image(imageable)
render :partial => "images/#{imageable.class.to_s.tableize}"
end
end
答案 2 :(得分:1)
我有点天气,所以我无法测试。但你应该放入<%= render imageable.images %>
并看看它的内容。它应该工作,因为它应该使用.modelname或.class :)如果它不起作用我会做你正在做的如上所述。如果它不起作用,请评论它说的内容,因为那时我可能会为rails core做一个补丁,真的应该这样工作。
答案 3 :(得分:1)
我认为你最初的想法是在正确的轨道上,稍作调整:
= render imageable.images
# images/_image.html.haml
= render image.imageable_type.underscore, :object => image.imageable, :image => image
# images/_product.html.haml
// Custom code for product image (with product and image local variables)