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

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

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

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

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

т.

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

.

Ответы

Ответ 1

Терминология в вашем вопросе немного запутана. Если они находятся в контроллере, и вы хотите выполнить код в другом методе действий в другом контроллере и отобразить его шаблон, вы должны перенаправить на это действие. Пусть говорят, что другой контроллер называется 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 "categories" на ответ от действия, на которое ссылается.

Ответ 2

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

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

Ответ 3

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