考虑以下多态关系
class Person
has_many :photos, :as => :attachable
end
class Animal
has_many :photos, :as => :attachable
end
class Photo
belongs_to :attachable, :polymorphic => true
end
Person 或 Animal 对象的视图页面包含其各自照片的图库。这些页面包含以下代码:
...
<%= 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 类中引入一个控制器动作来显示它们的相应信息。图库应链接到此操作而不是上面的操作,并且该操作应渲染照片。
但是,我觉得要显示的相应信息很少,值得每个班级自己采取行动。也许助手就足够了,但我不确定正确的方法(如果上述假设属实,请纠正我)。