Суб-контроллеры Rails? - PullRequest
1 голос
/ 01 апреля 2009

Я довольно новичок в Rails и у меня есть проблема, которую я не могу решить обдумайте архитектурно «правильный» способ сделать это.

Проблема связана с тем, что я называю субконтроллерами. Сценарий это:

У меня есть серия страниц, на которой есть панель некоторой формы, содержащая некоторая информация (например, пользовательская панель в gitHub вверху справа).

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

Вопрос в том, как вы это делаете? Как я могу сделать суб контроллер изнутри?

Ответы [ 4 ]

3 голосов
/ 01 апреля 2009

Я бы поместил логику в помощник или модуль. (http://api.rubyonrails.org/classes/ActionController/Helpers/ClassMethods.html)

Затем визуализируйте партиалы, где вы хотите, чтобы эти вещи отображались. (http://api.rubyonrails.org/classes/ActionView/Partials.html)

2 голосов
/ 10 июля 2009

Я не думаю, что модуль - это то, что требуется здесь, модули требуются для общего поведения в небольшом подмножестве ваших классов.

Я думаю, что здесь требуется понимание наследования ApplicationController, а также макетов

так, например, мой макет может выглядеть так:

<html>
<head><title>Foo</title></head>
<body>
  <%= render :partial => (current_user ? "/shared/user_widget_bar" : "/shared/login_bar") %>
  <%= yield %>
</body>
</html>

Любой код, который я хочу использовать для этого, будет помещен в мой ApplicationController, поскольку он будет использоваться большинством моего приложения:

 before_filter :generate_user_widget
 def generate_user_widget
   if current_user
     @avatar = ...
     @unread_messages = ...
   end
 end

Я понимаю, что, возможно, было бы чище, если бы он принадлежал к отдельному контроллеру, НО, если честно, если код не огромен, это не имеет значения и даже может быть помещен в модуль, который затем включается ActionController. Однако он должен быть внутри ApplicationController, если вы рассматриваете его область действия.

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

например:

class SiteA::SiteAParentController < ApplicationController
   before_filter :generate_user_widget
   ...
end

class SiteA::ProductController < SiteA::SiteAParentController
  def index
    ...
  end
end
2 голосов
/ 06 апреля 2009

Как сказал Герман, если это логика, которую вам нужно сгенерировать после того, как контроллер переключился на представление (т. Е. Контроллер Pages генерирует представление страницы, но вам нужна настраиваемая панель), то поместите ее в помощник. Или вызовите отдельный метод в вашем контроллере Pages перед передачей в представление. Или, если логики много, создайте модуль и поместите его в папку / lib. Таким образом, у вас может быть целый модуль Panel с методами, которые генерируют разные части вашей Panel и которые вызываются вашим контроллером. Но если вы хотите вызывать эти методы из представления, вам следует вместо этого использовать помощника.

1 голос
/ 01 апреля 2009

хорошо, если вам действительно нужно вызвать действие контроллера из представления, вы можете использовать компоненты. Они были частью фреймворка, теперь они существуют только как плагины. Один из таких плагинов, который, кажется, в хорошем состоянии, находится здесь: http://github.com/cainlevy/components/tree/master

из документов:

== Использование

Обратите внимание, что эти примеры очень упрощены и их лучше реализовать с использованием партиалов Rails.

=== Генератор

Запуск script/generator users details создаст UsersComponent с представлением «детали». Вы могли бы тогда конкретизировать шаблоны как это:

class UsersComponent < Components::Base
  def details(user_or_id)
    @user = user_or_id.is_a?(User) ? user_or_id : User.find(user_or_id)
    render
  end
end

=== Из ActionController

class UsersController < ApplicationController
  def show
    return :text => component("users/detail", params[:id])
  end
end

=== Из ActionView

<%= component "users/detail", @user %>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...