Контроллер Rails: возможна ли вложенная визуализация представлений? - PullRequest
1 голос
/ 04 февраля 2012

Я делаю учебное пособие по рельсам Lynda.com, и они объясняют, как визуализировать другое представление, отличное от стандартного, с помощью render ('methodname').

Однако я заметил, что этот рендеринг не является "вложенным". Например, в приведенном ниже коде localhost: 3000 / demo / index сгенерирует представление в views / demo / hello.html.erb, а localhost: 3000 / demo / hello отобразит текст «Hello there».

Есть ли способ сделать "вложенный" рендеринг, то есть, чтобы запрос демо / индекса возвратил 'Hello there' в этом примере?

(Кроме того, некоторые варианты использования для вложенного рендеринга были бы хорошими. Я спрашиваю только из любопытства.)

class DemoController < ApplicationController
  def index
     render ('hello')            
  end

  def hello
    render(:text => 'Hello there')
  end

end

Ответы [ 2 ]

2 голосов
/ 04 февраля 2012

Я не знаю, что именно вы подразумеваете под вложенным рендерингом.

Сценарий # 1

Если вы хотите, чтобы действие "index" запускалось, но шаблон "hello.html.erb ", который будет показан, вы можете сделать

def index
  render :action => :hello
end

. Это отрендерит шаблон app/views/demos/hello.html.erb (или другой формат, если вы хотите его (т.е. укажите его в URL)).

Так что render :action => :hello - это просто ярлык.

Вы также можете сделать render :template => "hello.html.erb" или render :file => Rails.root.join("app/views/demos/hello.html.erb") (иногда полезно).

Сценарий # 2

Если вы хотите визуализировать этот текст, вы можете просто вызвать метод hello внутри метода index

def index
  hello
end

Если вы не хотите запускать другие вещи из действия hello, вы можете отделитьэто к другому методу, например так:

def render_hello
  render :text => "Hello world"
end

def index
  # some other stuff going on...
  render_hello
end

def hello
  # some other stuff going on...
  render_hello
end

Вы не можете выполнить рендеринг дважды в одном действии.

Между прочим, в URL не должно быть указано /demos/index, а просто /demos.Индекс - это действие по умолчанию для resources маршрута (resources :demos).

Пожалуйста, выберите подходящий вам сценарий (чтобы я мог удалить ненужный текст из этого ответа).

0 голосов
/ 04 февраля 2012

В настоящее время вы пытаетесь выполнить рендеринг в контроллере, весь рендеринг должен обрабатываться в представлениях в Rails.

Итак, для вашей структуры выше, ваш DemoController должен находиться в файле на

приложение / контроллеры / demo_controller.rb

и представления будут отображаться в файлах, расположенных по адресу:

приложение / просмотров / демо / index.html.erb

и

app / views / demo / _hello.html.erb (Подчеркивание в имени файла _hello.html.erb указывает Rails, что это «частичное» отображение на другой странице)

Внутри файла index.html.erb вы вызываете рендер для файла hello.html.erb. Ваш полученный код должен выглядеть следующим образом:

demo_controller.rb

class DemoController < ApplicationController

  def index          
  end

end

index.html.erb

<%= render 'demo/hello' %>

_hello.html.erb

<p>Hello there</p>
...