Rails 3多态关联,查看页面

时间:2012-05-07 10:46:24

标签: ruby-on-rails ruby-on-rails-3.1 polymorphic-associations

考虑以下多态关系

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

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

1 个答案:

答案 0 :(得分:2)

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

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

我在这里看到的唯一缺点是,无论何时引入新类型的可连接,您都需要返回并扩展逻辑。您可以添加默认图库视图以缓解此问题。