Rails: использование Yield, вызов нескольких страниц просмотра

Проблема: как визуализировать несколько страниц просмотра с разных контроллеров?

В моем views / layouts / application.html.erb я вызываю views / posts / index.html.erb с методом yield.

<div class='span10'>
    <%= yield %>
</div>

Вдобавок к этому я хотел вызвать views / good_posts / index.html.erb с yield. Поэтому в этом конкретном индексном файле я оборачиваю весь код с помощью метода content_for.

<%= content_for :good_post do %> all my content in good_post/index.html.erb <% end %>

Я возвращаюсь к application.html.erb, я пытался вызвать индексный файл good_post методом yield.

<div class='span10'>
    <%= yield :good_post %>
</div>
<div class='span10'>
    <%= yield %>
</div>

Я думал, что это приведет к тому, что good_post / index будет отображаться поверх post / index, но это не сработало; только запись / указатель были правильно отрисованы, как и раньше. Может ли кто-нибудь объяснить, почему это так, и рассказать мне, как правильно подойти к этой проблеме? Я ценю вашу помощь!


person Maximus S    schedule 18.11.2012    source источник
comment
Вы используете кеширование? content_for в этом случае игнорируется. В противном случае попробуйте <%= content_for :good_post %> вместо <%= yield :good_post %>. Оба действительны, но посмотрите, имеет ли это какое-либо значение.   -  person cdesrosiers    schedule 18.11.2012
comment
Я думал, вам нужно одновременно использовать yield AND content_for. Вот почему я сделал content_for в good_posts / index, а чтобы вызвать этот файл, я сделал выход из application.html.   -  person Maximus S    schedule 18.11.2012
comment
Вы должны использовать content_for при определении содержимого, как вы это делали. Вы можете использовать content_for или yield при рендеринге контента. См. это   -  person cdesrosiers    schedule 18.11.2012
comment
Понятно. Я пробовал, но не вышло. Все еще пытаюсь найти способ включить index.html из представления good_posts в макет приложения ...   -  person Maximus S    schedule 18.11.2012
comment
Вы всегда можете обойти это, разложив содержимое good_posts/index.html.erb на частичное, скажем, good_posts/_posts.html.erb, и используя <%= render 'good_posts/posts' %> в good_posts/index.html.erb и posts/index.html.erb   -  person cdesrosiers    schedule 18.11.2012
comment
Спасибо! Это сработало. Еще одна вещь, которую мне пришлось сделать, - это снова определить локальные переменные, которые были определены в GoodPostController в партиале. В противном случае вы получите ошибку «Локальная переменная не существует».   -  person Maximus S    schedule 20.11.2012


Ответы (1)


Вы должны, как сказал @cdesrosiers, переименовать файл index.html.erb в good_posts в _index.html.erb. Затем вы можете отобразить это представление в своем приложении следующим образом:

<div class='span10'>
    <%= render 'good_posts/index' %>
    <%= yield :good_post %>
</div>
<div class='span10'>
    <%= yield %>
</div>

Лично я бы изменил файл index.html.erb в папке good_posts на файл _good_posts.html.erb в папке app/views/posts. Ваш код будет иметь большее значение, и вы сможете узнать, где его найти после, потому что он относится к posts. Итак, если вы измените это, используйте этот код:

<div class='span10'>
    <%= render 'posts/good_posts' %=
    <%= yield :good_post %>
</div>
<div class='span10'>
    <%= yield %>
</div>

Еще одно, что вам следует изменить, это content_for :good_post -> content_for :good_posts, потому что у хороших постов может быть много постов, поэтому вам следует использовать пост во множественном числе.

person Thanh    schedule 18.11.2012