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

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

я пробовал

render :template => "question/answer"

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

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

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

Спасибо


person Paul    schedule 18.06.2009    source источник


Ответы (4)


Рендеринг шаблона должен работать

 render :template => "question/answer"

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

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

а не обычный

<%= render :partial => 'some_partial' %> 
person Ben Hughes    schedule 18.06.2009
comment
Есть ли новый способ сделать это в rails 3.x? Я спрашиваю, потому что использую драгоценный камень, который позволяет помощникам автоматически выполнять рендеринг в представлении (иначе ваше решение будет работать). Я бы предпочел не перезаписывать помощников этого драгоценного камня. Спасибо! - person montrealmike; 28.10.2011

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

render 'question/answer'
person klew    schedule 18.06.2009
comment
Будет ли это также запускать все действия before_action в этом контроллере? - person MikanPotatos; 17.08.2016
comment
@MikanPotatos вообще не ударит по этому контроллеру. - person BKSpurgeon; 04.02.2020

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"]
person Steve    schedule 03.01.2019
comment
Важно сказать: второе решение работает в моем контексте, когда мое действие на AnotherQuestionController отображает представление, содержащее частичный рендеринг. Спасибо! - person Rafael Gomes Francisco; 26.04.2020

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

person Shadwell    schedule 18.06.2009
comment
Спасибо, я посмотрю на это. Кажется, что много работы, хотя это не так. Я бы подумал, что render() будет использовать параметры, позволяющие указать представления/части другого контроллера. Ах хорошо. - person Paul; 19.06.2009