Для людей, которым нужен только вопрос, вот он:

Есть ли способ указать папку для просмотра при вызове render объекта? Я не хочу указывать вид, только папку для просмотра.

А для людей, которым нужен контекст:

Я работаю над системой потока активности (что-то вроде google + / facebook).

У меня есть «Действия», которые в точности похожи на ленты google + (или facebook, или что-то еще!). Итак, у меня есть простой цикл, отображающий каждое действие, привязанное к одному из следующих объектов (полиморфных): Пользователь, Группа, Комментарий, Примечание.

На мой взгляд, отображающие активность (views/activities/_activity.html.erb), у меня есть

<%= render activity.object %>

Где activity.object - ссылка на связанный объект (Пользователь, Группа, Заметка, Комментарий). Если это пользователь, он переходит в views/users/_user.html.erb и отображает его. Для группы: views/groups/_group.html.erb.

Это прекрасно работает. Однако я дохожу до того, что рендеринг группы в моих действиях не должен совпадать с рендерингом на странице списка групп. Есть ли способ указать папку для поиска при вызове render объекта? Так что мой:

<%= render activity.object %>

Станет :

<%= render activity.object, :folder => 'views/activities/' %>

Обратите внимание, что я не хочу указывать, какое представление напрямую, поскольку я не хочу создавать кейс для каждого из возможных типов объектов (Пользователь, Группа, Заметка, Комментарий) в действии. Я хочу иметь то же поведение, что и сейчас, а это означает, что если он найдет views/activities/_user.html.erb, он загрузит любого пользователя в действиях с этим представлением вместо того, которое есть в views/users/_user.html.erb.

Благодарность

1
Dominic Goulet 29 Авг 2011 в 18:00

3 ответа

Лучший ответ

Я не знаю ни одной опции типа папки, но когда я это делаю, я обычно делаю:

<%= render "activities/#{activity.object.class.name.underscore}" %>

Это привело бы к аналогичному поведению.

РЕДАКТИРОВАТЬ . Хороший момент, приведенный ниже Домиником, заключается в том, что если ваши классы вложены в пространства имен, вам нужно будет включить соответствующую структуру.

Т.е.

 module Foo
   class Bar < ActiveRecord::Base
   end
 end

 # class.name is Foo::Bar, underscored is 'foo/bar'

 <%= render "activities/#{activity.object_type.underscore}" %>
 # will be in
 activities/foo/_bar.html
3
Kristian PD 30 Авг 2011 в 11:32

В текущем Rails (3.2.9) вы можете определить метод to_partial_path для своей модели, чтобы указать ей, где искать.

Например, вы можете:

class User
  def to_partial_path; "user"; end
end

Затем Rails будет искать _user.html.erb относительно представления, из которого вы вызываете render.

2
Pete Yandell 22 Дек 2012 в 14:07

Мой собственный подход, который я извлек в гем polymorphic_render - добавлять суффиксы для специальных частичных файлов, но хранить их частичный в папках ресурсов.

В вашем случае views/users/_user.html.erb будет иметь очень общее представление пользователя (которое, вероятно, используется при отображении списка пользователей), но views/users/_user_activity.html.erb будет отображать специальный фрагмент для активности пользователя.

И вставить эти частичные данные очень просто, просто <%= polymorphic_render activity.object, :activity %>

0
mikdiet 4 Мар 2015 в 08:55