Rails 4 - Рендеринг моделей STI из общего партиала

У меня есть такие модели STI: Photo < Medium и Video < Medium. Где-то в представлении я хотел бы показать их так:

# app/views/albums/show.html.slim
ul
  li= render @album.media

render поиск частичного albums/_photo или albums/_video :

# app/views/albums/_photo.html.slim
h3= photo.title
= image_tag photo.file.url
p= photo.description

# app/views/albums/_video.html.slim
h3= video.title
= video_tag video.file.url
p= video.description

Теперь я хотел бы создать шаблон для использования в app/views/albums/show.html.slim, чтобы не повторять общие поля между носителями. Что-то подобное :

# app/views/albums/_medium.html.slim
h3= medium.title
= yield(:medium_tag)
p= medium.description
= yield(:medium_additionnals)

# app/views/albums/_photo.html.slim
- content_for(:medium_tag) do
  = image_tag photo.file.url
- content_for(:medium_additionnals) do
  # any additionnals fields

# app/views/albums/_video.html.slim
- content_for(:medium_tag) do
  = video_tag video.file.url
- content_for(:medium_additionnals) do
  # any additionnals fields

Но это дает мне конкатенацию содержимого...

У кого-то есть решение/альтернатива для этого?

[РЕДАКТИРОВАТЬ]

С этими шаблонами:

# app/views/albums/show.html.slim
= render @album.media

# app/views/albums/_medium.html.slim
div
  h3= medium.title
  = yield(:medium_tag)

# app/views/albums/_photo.html.slim
- content_for(:medium_tag) do
  | TEST

Полученный HTML:

<div>
  <h3>Photo1</h3>
  TEST
</div>
<div>
  <h3>Photo2</h3>
  TESTTEST
</div>
<div>
  <h3>Photo3</h3>
  TESTTESTTEST
</div>
<div>
  <h3>Photo4</h3>
  TESTTESTTESTTEST
</div>
...

Результат yield объединяется столько раз, сколько раз носитель.


person JoJoS    schedule 10.12.2015    source источник
comment
Можете ли вы опубликовать полученный HTML-код?   -  person Richard Peck    schedule 10.12.2015
comment
Я редактирую свой вопрос с примером результата   -  person JoJoS    schedule 11.12.2015


Ответы (1)


Ваш код кажется действительно хорошим, хотя я не понимаю, как ваш вызов render циклически проходит через каждый элемент medium

Вы можете использовать helper для возврата соответствующих данных. , хотя это было бы не самым эффективным:

#app/helpers/application_helper.rb
module ApplicationHelper
      output =  Slim::Engine.new  "h3={item.title}"
      output += Slim::Engine.new  "- eval(#{item.model_name.human}_tag) item.file.url"
      output += Slim::Engline.new "p=item.description"
   end
end

Это позволит вам запустить:

#app/views/albums/_photo.html.slim
= media photo

#app/views/albums/_video.html.slim
= media video

-

В качестве альтернативы вы можете просто поместить его в партиал _medium:

#app/views/albums/_photo.html.slim
= render partial: "medium", locals: { item: photo }

#app/views/albums/_video.html.slim
= render partial: "medium", locals: { item: video }

_medium будет иметь следующее:

#app/views/albums/_medium.html.slim
h3=item.title
- eval("#{item.model_name.human}_tag") item.file.url
p=item.description
person Richard Peck    schedule 10.12.2015