组织多态资源的部分

时间:2010-08-06 16:57:39

标签: ruby-on-rails partial-views organization

我正在寻找其他人通常如何组织他们的偏好来获取多态资源。

示例:

Image是多态的,根据imageable的内容,我希望显示的内容略有不同。

我有一个部分images/_image,可以致电render imageable.images。我目前的心态是让我的图像部分检查imageable是什么类型,然后有另一部分,特定于该情况。我的组织将有以下几点:

images/
  _image.html.haml
  _product.html.haml
  _post.html.haml
  _user.html.haml

我的_image部分看起来像是:

%div
  = render :partial => "images/#{imageable.type}"

这看起来是一种糟糕的做法,还是采取了错误的做法?我认为从任何地方拨打render imageable.images比在整个地方拨打render :partial => ...要好得多。

任何想法都将不胜感激。你是怎么做到的?

编辑:很长一段时间过去了,我仍然想知道是否有人对此有任何意见。抛出赏金,看看是否引起了一些注意。

4 个答案:

答案 0 :(得分:2)

现在,您的代码中不清楚_product实际上是_image

我认为Rails的目的是这样做:

shared/
    _image.html.haml
    imageable/
      _product.html.haml
      _post.html.haml
      _user.html.haml

然后在您调用的_image部分中:

render :partial => imageable/#{image.type}", :image => image

现在从您的目录结构中可以清楚地知道您的多态性是什么。

(注意:我使用了shared目录,但是当你的图像部分实际上没有在视图之间共享时,它应该在某个视图目录中,就像你实际上有一个images_controller目录一样被称为images

答案 1 :(得分:2)

我认为你有正确的方法,但我认为清洁的最后一步是消除选择另一部分的图像部分,而不是将该行为传递给帮助者。类似......

module ImagesHelper
  def show_image(imageable)
    render :partial => "images/#{imageable.class.to_s.tableize}"
  end  
end

答案 2 :(得分:1)

我有点天气,所以我无法测试。但你应该放入<%= render imageable.images %>并看看它的内容。它应该工作,因为它应该使用.modelname或.class :)如果它不起作用我会做你正在做的如上所述。如果它不起作用,请评论它说的内容,因为那时我可能会为rails core做一个补丁,真的应该这样工作。

答案 3 :(得分:1)

我认为你最初的想法是在正确的轨道上,稍作调整:

= render imageable.images

# images/_image.html.haml
= render image.imageable_type.underscore, :object => image.imageable, :image => image

# images/_product.html.haml
// Custom code for product image (with product and image local variables)