Организация партиалов для полиморфного ресурса - PullRequest
9 голосов
/ 06 августа 2010

Я ищу, как другие обычно организуют свои части для полиморфного ресурса.

Пример:

У меня есть 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 ]

2 голосов
/ 28 мая 2011

Я думаю, что у вас есть правильный подход, но я думаю, что последний шаг к чистоте - это исключить частичную часть изображений, которая выбирает другую частичную, вместо этого передав это поведение помощнику.что-то вроде ...

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

?

2 голосов
/ 26 мая 2011

В вашем коде теперь неясно, что _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 голос
/ 26 мая 2011

Я считаю, что ваша оригинальная идея находится на правильном пути, с незначительной корректировкой:

= 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)
1 голос
/ 21 мая 2011

Я немного под погодой, поэтому я не могу это проверить.Но вы должны просто вставить <%= render imageable.images %> и посмотреть, что он говорит.Он должен работать, потому что он должен использовать .modelname или .class :) Если это не работает, я бы сделал то, что вы делаете, как упомянуто выше.Если это не сработает, пожалуйста, прокомментируйте с тем, что он говорит, потому что тогда я, вероятно, сделаю патч для ядра rails для этого, действительно должно работать так.

...