Рендеринг частичных элементов из представления одного контроллера в представление другого контроллера в Rails

У меня есть представление для контроллера под названием "show". Внутри этого представления я хочу отобразить содержимое представления другого контроллера - и, очевидно, логика для формы на этом представлении, чтобы поговорить с контроллером, которому она принадлежит. Как мне это сделать? Я довольно новичок в rails,и я еще не на 100% уверен в рамках.

вы почти можете считать их "виджетами" в представлении. Я знаю, что вы можете отображать действия с одного и того же контроллера в представлении использование:

render :action => "show_home_page", :layout=> false

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

ie.

У меня есть мнение, что визуализируется на макет. Это мнение, принадлежит контроллеру А. Мне нужно отобразить "индекс" и " новый" виды из контроллера B внутри исходного вида (выше)

.

3 ответов


терминология в вашем вопросе немного запутана. Если вы находитесь в контроллере, и вы хотите выполнить код в другом методе действия в другом контроллере и отобразить его шаблон, вы должны redirect_to это действие. Допустим, другой контроллер называется ContractsController

redirect_to :controller => "contracts", :action => "show_home_page"

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

например, если шаблон находится в папке контроллера контрактов.

render :action => "/contracts/show_home_page", :layout=> false

Я думаю, что в этом случае вы на самом деле говорите о частичном, который будет выглядеть как

render :partial => "/contracts/show_home_page"

однако, я вижу, что вы хватаетесь за то, что вы на самом деле хотите вызвать несколько методов действий для рендеринга одной страницы. Это не так работает. Вам придется установить объекты, на которые шаблоны будут ссылаться в одном действии. Это одна из причин, по которой большинство разработчиков Rails помещают много кода в модели, поэтому настройка не повторяется на всех контроллерах.

но есть другой способ... где магия JavaScript приходит.

на Вашей странице создайте такую функцию:

<script type="text/javascript" language="javascript">    
function load_categories() {
            <%= remote_function(:url => {:controller => "categories", :action => "list"},
                                  :update => "categories")%>
        };
</script>

если вы называете это в onload даже вашей страницы, он заменит div с id " категории" с ответом от действия, на которое ссылаются.


Если вы действительно хотите сделать совершенно другое действие (т. е. имитировать запрос на прохождение всего стека Ruby on Rails), вы можете использовать Webrat (Регистрация Webrat скринкаст здесь).

в традиционных веб-приложениях MVC вам редко нужно это делать. Но по моему опыту разработки SOFEA-style и микро-архитектура webapps, это становится все более и более распространенным.


Я не уверен, что полностью понимаю ваше заявление о проблеме (почему это должно быть сделано с точки зрения), но я бы сказал, что вы просто позвоните redirect_to от контроллера A к контроллеру B.