Рендеринг одного контроллера с использованием представлений другого контроллера - PullRequest
34 голосов
/ 18 июня 2009

У меня есть QuestionController Теперь у меня есть AnotherQuestionController с действиями, которые должны отображаться с использованием шаблонов и частичных файлов в app / views / question / Это возможно? Похоже, так и должно быть.

Я пробовал

render :template => "question/answer"

но answer.html.erb содержит партиалы, и я получаю сообщения об ошибках типа

"Отсутствует шаблон another_question / _my_partial.erb в пути просмотра"

Так есть ли способ сказать Rails "обрабатывать AnotherQuestionController как его QuestionController и искать представления и частичные значения в app / views / question"? Или мне придется создать app / views / another_question - что приведет к дублированию (это не может быть способом Rails).

Спасибо

Ответы [ 4 ]

52 голосов
/ 18 июня 2009

Визуализация шаблона должна действительно работать

 render :template => "question/answer"

Проблема, с которой вы столкнулись, связана с тем, что частички смотрят не туда. Исправление простое, просто сделайте ваши частичные абсолютными в любых общих шаблонах. Например, вопрос / answer.html.erb должен иметь

<%= render :partial => 'question/some_partial' %>

вместо обычного

<%= render :partial => 'some_partial' %> 
12 голосов
/ 18 июня 2009

Вы можете достичь этого с помощью:

render 'question/answer'
0 голосов
/ 03 января 2019

Rails использует список префиксов для разрешения шаблонов и партиалов. В то время как вы можете явно указать префикс («вопрос / ответ»), как предлагается в другом ответе, этот подход потерпит неудачу, если сам шаблон содержит неквалифицированные ссылки на другие частичные значения.

Если предположить, что у вас есть суперкласс ApplicationController и унаследован от него QuestionController, то места, где Rails будет искать шаблоны, по порядку, «app / views / question /» и «app / views / application /». (На самом деле, он также будет выглядеть в виде последовательности путей просмотра, но для простоты я приукрашиваю это.)

Учитывая следующее:

class QuestionController < ApplicationController
end

class AnotherQuestionController < ApplicationController
end

QuestionController._prefixes
# => ["question", "application"]
AnotherQuestionController._prefixes
# => ["another_question", "application"]

Решение № 1. Поместите частичное в «app / views / application /» вместо «app / views / question /», где оно будет доступно обоим контроллерам.

Решение № 2. Наследовать от QuestionController, если необходимо.

class AnotherQuestionController < QuestionController
end
=> nil
AnotherQuestionController._prefixes
# => ["another_question", "question", "application"]

Решение № 3. Определение метода класса AnotherQuestionController :: local_prefixes

Это было добавлено в Rails 4.2.

class AnotherQuestionController < ApplicationController
  def self.local_prefixes
    super + ['question']
  end
end
AnotherQuestionController._prefixes
# => ["another_question", "question", "application"]
0 голосов
/ 18 июня 2009

Вы можете попробовать плагин inherit_views (http://github.com/ianwhite/inherit_views/tree/master) Я упоминал здесь в ответе на этот вопрос .

...