Rails: визуализировать представление (а не частично) изнутри представления
У меня есть контроллер, который отвечает как на html
, так и на js
. Представление html
отображает всю страницу (включая верхний и нижний колонтитулы), а js
заменяет только #main
. Помимо верхнего и нижнего колонтитула оба формата отображают один и тот же контент. Я могу получить этот эффект с тремя файлами:
_show.html.erb
<div>Content!</div>
show.html.erb
<%= render "show" %>
show.js.erb
$("#main").fadeIn("<%= escape_javascript(render 'show') %>");
Это работает, но я бы предпочел, если бы мне не понадобилось отдельное частичное _show
. К сожалению, это не работает:
show.html.erb
<div>Content!</div>
show.js.erb
$("#main").fadeIn("<%= escape_javascript(render 'show') %>");
Так как Rails будет искать частичный, а не фактический вид show
.
Есть ли способ заставить Rails искать файл вида, а не частичный?
Ответы
Ответ 1
Предоставление не частичного представления внутри другого представления не является точно Rails Way ™. Ваше текущее решение, вероятно, лучше, а не необычный подход. Переименуйте его _body или что-то еще подходящее, если вы чувствуете странность в том, что частичное имя совпадает с действием.
Однако, если ваше представление может быть общим, поскольку, похоже, это может быть в этом случае, вы можете просто сделать его макетом.
Этому способствует тот факт, что, в отличие от принципа наименьшего удивления, Rails отобразит html
шаблон для действия js
, если шаблон js
не существует. Это означает, что вы можете удалить как шаблон js, так и частичный, и просто создать макет, например, fadein.js.erb
:
# yourviews/show.html.erb
<div>Content!</div>
# layouts/fadein.js.erb
$("#main").fadeIn("<%= escape_javascript(yield) %>");
# YourController.rb
def show
# ...
respond_to do |wants|
wants.html
wants.js { render :layout => "fadein" }
end
end
Ответ 2
Как уже упоминалось, рендеринг другого не частичного представления в другом представлении - "Не путь к рельсам", если вы все еще настаиваете на этом, один из методов:
<%= render :file => '<replace with relative/absolute path>' %>
Ответ 3
Это не очень хорошая практика, как вы можете видеть по комментариям. Рельсы имеют концепции представления, частичного и макета. Тем не менее, мнение является единственным, которое вы должны использовать только один раз. Поэтому мои предложения:
- Если вы чувствуете, что в вашем текущем представлении может отображаться больше одного дополнительного представления, вы, скорее всего, ищете макет
- Если вы считаете, что одно из ваших представлений должно отображаться на многих страницах, вы ищете partial
- Если это представление должно отображать только один дополнительный просмотр внутри него, и это представление должно отображаться только в текущем представлении, вы можете выбрать любой из вышеперечисленных или ни один из них - что он, идите с одним файлом
Ответ 4
вам просто нужно передать контекст вашему методу render
:
<%= render :template => "show" -%>