Где разместить партиалы, общие для всего приложения в Rails? - PullRequest
53 голосов
/ 05 марта 2010

Куда мне пойти, чтобы разместить частичные файлы, совместно используемые несколькими моделями? У меня есть страница с именем crop.html.erb, которая используется для одной модели - Photo. Теперь я хотел бы использовать его и для другой модели под названием User.

Я мог бы скопировать и вставить код, но это не очень СУХО, поэтому я решил, что переместу его в часть.

Поскольку он разделен между двумя моделями - , где бы я разместил этот частичный ?

Спасибо!

Ответы [ 6 ]

59 голосов
/ 05 марта 2010

Соглашение Rails состоит в том, чтобы поместить общие пароли в /app/views/shared.

47 голосов
/ 27 марта 2012

Обновление

Наследование макета теперь находится в руководствах под макет и рендеринг Шаблон наследования работает аналогично.

В Rails 3.1 и последующих версиях реализовано наследование шаблонов, поэтому я думаю, что правильное место для общих партилей теперь /app/views/application/, скажем, вы в products#index, вы можете сделать следующее:

-# products#index
= render @products.presence || 'empty'

-# /app/views/application/_empty.html.haml
There are no items

кстати это application, потому что соединение является наследованием контроллера, поэтому это предполагает ProductsController < ApplicationController

Таким образом, если вы реализуете /app/views/products/_empty.html.haml, который будет взят, вышеприведенное является резервным вариантом для всех отсутствующих частичек, и я не могу сейчас проверить, но я думаю, что даже для самого шаблона ...

Railscast: шаблонное наследование!

23 голосов
/ 07 февраля 2016

TL; DR

Рельсы 3.1, Рельсы 4, Рельсы 5 и все, что будет дальше

app/views/application

Движок автоматически ищет этот путь, если представление не найдено в пути контроллера.

Рельсы 3 и ранее

app/views/shared

Движок НЕ ищет этот путь автоматически.


Длинная история

Rails 3 (и более ранняя версия) имеют нет значения по умолчанию место для хранения общих представлений.

Неофициальное соглашение предназначено для хранения общих представлений в app / views / shared . Где бы вы ни хранили их, вы должны указать путь

# render app/views/shared/menu.html.erb
<%= render :partial => "shared/menu" %> 

Это предложение было популяризировано Agile Web Development с Rails .

Rails 3.1 вводит официальный стандарт для хранения общих представлений:
Приложение / просмотров / приложение

Благодаря этому стандарту движок теперь автоматически ищет шаблоны в app / views / application . В результате, вам больше не нужно использовать полный путь .

Любопытные могут следовать здесь мыслительному процессу, стоящему за этим решением.

Старый синтаксис

# render app/views/application/menu.html.erb
# unless menu.html.erb is found in appp/views/my_controller
<%= render :partial => "menu" %> 

Новый синтаксис

# render app/views/application/menu.html.erb
# unless menu.html.erb is found in appp/views/my_controller
<%= render partial: "menu" %> 

Конечно, вы по-прежнему можете размещать свои общие представления в любом месте и ссылаться на них по пути

<%= render :partial => "my_own_special_shared_folder/menu" %>

Если у вас нет веских причин для этого, придерживайтесь нового стандарта и сохраняйте общие представления в app/views/application.

4 голосов
/ 27 ноября 2012

В Rails View используется app/views/layouts для общих партиалов, таких как верхний и нижний колонтитулы, но в Ruby on Rails Guide используется app/views/shared в , например . Я думаю, это сводится к личным предпочтениям. Я бы использовал layouts для высокоуровневых вещей, таких как основная навигация или нижний колонтитул, но shared для более узких вещей уровня контроллера, таких как форма.

3 голосов
/ 05 марта 2010

У меня вообще есть папка shared в моих представлениях, которая содержит часто используемые партиалы.

0 голосов
/ 05 марта 2010

Неважно, где вы их положили. Вы можете отобразить любой фрагмент в любом произвольном месте, указав путь к файлу render - его не нужно связывать с контроллером, который его отображает. Я использую каталог, просто называемый partials в каталоге view, и вызываю партиалы в нем так:

render :partial => 'partials/mypartial'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...