Для людей, которым нужен только вопрос, вот он:
Есть ли способ указать папку для просмотра при вызове 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
.
Благодарность
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
В текущем Rails (3.2.9) вы можете определить метод to_partial_path
для своей модели, чтобы указать ей, где искать.
Например, вы можете:
class User
def to_partial_path; "user"; end
end
Затем Rails будет искать _user.html.erb относительно представления, из которого вы вызываете render.
Мой собственный подход, который я извлек в гем polymorphic_render - добавлять суффиксы для специальных частичных файлов, но хранить их частичный в папках ресурсов.
В вашем случае views/users/_user.html.erb
будет иметь очень общее представление пользователя (которое, вероятно, используется при отображении списка пользователей), но views/users/_user_activity.html.erb
будет отображать специальный фрагмент для активности пользователя.
И вставить эти частичные данные очень просто, просто <%= polymorphic_render activity.object, :activity %>
Похожие вопросы
Новые вопросы
ruby-on-rails
Ruby on Rails - это полнофункциональная платформа веб-приложений с открытым исходным кодом, написанная на Ruby. Он следует популярной модели фреймворка MVC и известен своим подходом «соглашение поверх конфигурации» при разработке приложений.