1

考虑以下多态关系

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 类中引入一个控制器动作来显示它们的相应信息。图库应链接到此操作而不是上面的操作,并且该操作应渲染照片。

但是,我觉得要显示的相应信息很少,值得每个班级自己采取行动。也许助手就足够了,但我不确定正确的方法(如果上述假设属实,请纠正我)。

4

1 回答 1

2

如果 Animal 和 Person 之间的差异不能证明单独的控制器是合理的,那么您可以拥有一个控制器,并且在画廊的操作中,只需根据 @attachable 的类型呈现不同的视图:

if @attachable.is_a? Person
  render 'gallery_person'
elsif @attachable.is_a? Animal
  render 'gallery_animal'
end

我在这里看到的唯一缺点是,每当您引入一种新的可附加类型时,您都需要返回并扩展逻辑。您可以添加默认图库视图来缓解这种情况。

于 2012-05-07T10:58:49.543 回答