首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 3多态关联,查看页面

Rails 3多态关联,查看页面
EN

Stack Overflow用户
提问于 2012-05-07 18:46:24
回答 1查看 353关注 0票数 1

考虑下面的多态关系

代码语言:javascript
复制
class Person
  has_many :photos, :as => :attachable
end

class Animal
  has_many :photos, :as => :attachable
end

class Photo
  belongs_to :attachable, :polymorphic => true
end

人或动物对象的视图页面包含各自照片的图库。这些页面包含以下代码:

代码语言:javascript
复制
...
  <%= link_to(image_tag(photo.image_url(:thumb).to_s), [@attachable, photo]) %>
...

然而,在我的照片的查看页面中,我想根据它是属于一个人还是一个动物来呈现不同的信息。例如,如果它是一个人,它应该显示他/她的身高,宠物列表;如果它是一只动物,它应该显示它的品种,主人等。

做到这一点的最佳解决方案是什么?

我可以想到两种可能的解决方案:

一种方法是在照片中为每个类定向一个单独的控制器操作。就像这样

代码语言:javascript
复制
<%= 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类中引入一个控制器操作,以显示它们相应的信息。图库应该链接到这个动作,而不是上面的动作,并且这个动作应该渲染照片。

然而,我觉得对于每个类来说,要显示的相应信息只有很少的几个值得它自己操作。也许助手就足够了,但我不确定正确的方法(如果上面的假设是正确的,请纠正我)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-07 18:58:50

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

代码语言:javascript
复制
if @attachable.is_a? Person
  render 'gallery_person'
elsif @attachable.is_a? Animal
  render 'gallery_animal'
end

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10480687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档