Куда в Rails поместить части, общие для всего приложения?

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

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

Поскольку он используется совместно двумя моделями, где мне разместить этот фрагмент?

Спасибо!


person Yuval Karmi    schedule 05.03.2010    source источник


Ответы (7)


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

person John Topley    schedule 05.03.2010
comment
частичные файлы в /app/views/shared/ по какой-то причине не отображаются в моем приложении Rails 4?!? - person Meltemi; 01.08.2013
comment
Больше нет, для rails 4 правильным каталогом является app/views/application, и я думаю, что это имеет смысл... robots.thoughtbot.com/directory-for-shared-partials-in-rails - person Alex Escalante; 07.08.2015
comment
Это делает app/views/application/ отличным местом для ваших общих фрагментов — Руководство по макетам и рендерингу Rails - person Eliot Sykes; 30.09.2015

Обновить

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

Rail 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: наследование шаблонов!

person ecoologic    schedule 27.03.2012
comment
Я искал это решение некоторое время. Не могу поверить, что руководство или какие-либо другие онлайн-уроки не упоминают об этом. - person LunaCodeGirl; 14.12.2013
comment
Я отправил сообщение об этом в руководство, надеюсь, рано или поздно оно привлечет внимание github.com/rails/rails/pull/16738 - person ecoologic; 11.11.2014
comment
dhh написал: Это [приложение/представления/приложение] побочный эффект от этого разумного случая: EmployeesController ‹ PeopleController, который сначала будет искать сотрудников/шоу, а затем вернуться к поиску людей/шоу. Никогда не было намерения откатиться назад, чтобы искать применение/показ. Это непреднамеренный побочный эффект. github.com/rails/rails/pull/9911#issuecomment-15462128 - person notapatch; 11.09.2019
comment
Интересный. Мне нравится app/views/application: это очень последовательно, я сомневаюсь, что они уберут его сейчас. - person ecoologic; 12.09.2019

TL;DR

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

app/views/application

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

Rails 3 и более ранние версии

app/views/shared

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


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

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

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

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

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

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

Благодаря этому стандарту движок теперь автоматически ищет шаблоны в 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.

person Mihai Dinculescu    schedule 07.02.2016

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

person Henrik Sjökvist    schedule 27.11.2012

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

person Toby Hede    schedule 05.03.2010

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

render :partial => 'partials/mypartial'
person Jimmy    schedule 05.03.2010
comment
о, я прекрасно знаю. Меня интересовала лучшая практика. Спасибо хоть! - person Yuval Karmi; 05.03.2010
comment
в чем разница между render 'partials/mypartial' и render partial: 'partials/mypartial ? - person Arnold Roa; 22.01.2016

Я приехал сюда в 2021 году (рельсы 6) и запутался в ответах (много разных способов).

Я спросил некоторых старших разработчиков рельсов, что они будут делать, и они также дали мне 2 разных ответа.

Но TL;DR

Создайте папку под названием «общий доступ» или «приложение» внутри папки views (например, app/views/shared или app/views/application.

Затем просто переместите часть туда и получите доступ к ней с помощью

<%= render partial: 'shared/socials' %>

# or

<%= render partial: 'application/socials' %>

или еще проще

<%= render 'shared/socials' %>

# or

<%= render 'application/socials' %>
person stevec    schedule 18.01.2021