2012-02-04 3 views
1

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

Однако я заметил, что этот рендеринг не «вложен». Например, в приведенном ниже коде 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

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

Сценарий № 1

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

def index 
    render :action => :hello 
end 

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

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

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

Сценарий № 2

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

def index 
    hello 
end 

Если вы не хотите, чтобы другие вещи от привет действий, чтобы быть вы можете отделить его от другого метода, например:

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 

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

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

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

0

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

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

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

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

приложение/views/demo/index.html.Еврорадио

и

приложение/просмотров/демо/_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> 
Смежные вопросы