Подтвердить что ты не робот

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 искать файл вида, а не частичный?

4b9b3361

Ответ 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" -%>