Один рендеринг контроллера с использованием другого вида контроллера
У меня есть QuestionController
Теперь у меня есть AnotherQuestionController с действиями, которые должны отображаться с использованием шаблонов и партиций в app/views/question/
Это возможно? Похоже, это должно быть.
Я пробовал
render :template => "question/answer"
но answer.html.erb включает в себя частичные и я получаю ошибки вроде
"Отсутствует шаблон another_question/_my_partial.erb в пути просмотра"
Итак, есть способ сказать Rails "обрабатывать AnotherQuestionController, как будто его QuestionController и искать представления и частичные в приложении/представлениях/вопросе"?
Или мне нужно будет создать приложение /views/another _question, что приведет к дублированию (это не может быть путь Rails).
Спасибо
Ответы
Ответ 1
Отработка шаблона должна действительно работать
render :template => "question/answer"
Проблема, с которой вы столкнулись, - это частичное рассмотрение не в том месте. Исправить это просто, просто сделайте свои частичные абсолютные значения в любых общих шаблонах. Например, вопрос /answer.html.erb должен иметь
<%= render :partial => 'question/some_partial' %>
а не обычный
<%= render :partial => 'some_partial' %>
Ответ 2
Вы можете добиться этого с помощью:
render 'question/answer'
Ответ 3
Вы можете попробовать плагин inherit_views (http://github.com/ianwhite/inherit_views/tree/master). Я упомянул здесь в ответе на этот вопрос.
Ответ 4
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"]