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

Один рендеринг контроллера с использованием другого вида контроллера

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

Я пробовал

render :template => "question/answer"

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

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

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

Спасибо

4b9b3361

Ответ 1

Отработка шаблона должна действительно работать

 render :template => "question/answer"

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

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

а не обычный

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

Ответ 2

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

render 'question/answer'

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