考虑下面的多态关系
class Person
has_many :photos, :as => :attachable
end
class Animal
has_many :photos, :as => :attachable
end
class Photo
belongs_to :attachable, :polymorphic => true
end人或动物对象的视图页面包含各自照片的图库。这些页面包含以下代码:
...
<%= link_to(image_tag(photo.image_url(:thumb).to_s), [@attachable, photo]) %>
...然而,在我的照片的查看页面中,我想根据它是属于一个人还是一个动物来呈现不同的信息。例如,如果它是一个人,它应该显示他/她的身高,宠物列表;如果它是一只动物,它应该显示它的品种,主人等。
做到这一点的最佳解决方案是什么?
我可以想到两种可能的解决方案:
一种方法是在照片中为每个类定向一个单独的控制器操作。就像这样
<%= link_to(image_tag(photo.image_url(:thumb).to_s), show_person_path[@attachable, photo]) %>
<%= link_to(image_tag(photo.image_url(:thumb).to_s), show_animal_path[@attachable, photo]) %>然而,我认为这种方法在多态类中引入了不适当的视图逻辑委托。
另一种方法是在每个Person和Animal类中引入一个控制器操作,以显示它们相应的信息。图库应该链接到这个动作,而不是上面的动作,并且这个动作应该渲染照片。
然而,我觉得对于每个类来说,要显示的相应信息只有很少的几个值得它自己操作。也许助手就足够了,但我不确定正确的方法(如果上面的假设是正确的,请纠正我)。
发布于 2012-05-07 18:58:50
如果Animal和Person之间的差异不能证明单独的控制器是合理的,那么您可以有一个控制器,并且在图库的操作中,只需根据@attachable的类型呈现不同的视图:
if @attachable.is_a? Person
render 'gallery_person'
elsif @attachable.is_a? Animal
render 'gallery_animal'
end我在这里看到的唯一缺点是,每当您引入新类型的attachable时,您都需要回来并扩展逻辑。你可以添加一个默认的图库视图来缓解这个问题。
https://stackoverflow.com/questions/10480687
复制相似问题