Как использовать субконтроллеры в Ruby on Rails? - PullRequest
2 голосов
/ 21 сентября 2011

Я изучаю RoR, и у меня есть общая проблема дизайна, которую я пытаюсь обойти. Я хочу получить некоторую информацию об ответе, чтобы убедиться, что я следую какой-то наилучшей практике.

У меня есть страница, которая состоит из 3 подразделов, давайте назовем их A, B и C. Некоторые действия заставляют каждое из них обновляться через AJAX, поэтому я хочу, чтобы у каждого из них было действие контроллера, которое позволяет любому из их визуализировать индивидуально, без страницы хрома.

Я структурировал это прямо сейчас с помощью контроллера, который имеет 4 действия: index, A, B, C

Каждый из A, B и C отображает свой вид с layout => false, поэтому я могу отображать только этот фрагмент через AJAX, когда это необходимо. Затем у вас есть индекс, который отображает некоторые дополнительные вещи вместе с представлениями A, B и C.

По сути, мне нужны 3 субконтроллера и главный контроллер, который вызывает субконтроллеры по мере необходимости. Или я думаю это то, что я хочу. То, что я не хочу, это частичные представления, потому что есть некоторые настройки, которые я делаю в контроллере для каждого из A, B, C, и мне тогда пришлось бы дублировать код установки как в контроллере для индекса, так и в контроллере для А, В, С.

Код, который я имею в виду, выглядит примерно так:

my_controller.rb:

class MyController < ApplicationController
    def index
         @aOutput = A
         @bOutput = B
         @cOutput = C
         render //can use @aOutput, @bOutput, @cOutput in the view
    end

    def A
        render :layout => false    
    end

    def B
        render :layout => false
    end

    def C
        render :layout => false
    end
end

Это позволило бы мне теперь получить доступ к индексу MyController #, когда мне нужна полная страница, и к MyController # A и т. Д., Когда я хочу перерисовать содержимое каждого подраздела.

Проблема здесь в том, что если код структурирован следующим образом, вы столкнетесь с ошибками DoubleRender при доступе к индексу MyController #. Как правильно подходить к такого рода вещам? Не стесняйтесь взрывать любые предположения, которые я сделал здесь, единственное требование - это страница с тремя разделами, которые можно обновлять по мере необходимости по отдельности без перезагрузки всей страницы.

1 Ответ

0 голосов
/ 21 сентября 2011

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

  • Вы хотите иметь возможность отображать только видбез вызова всего действия контроллера.

    Это можно сделать с помощью render :action => :action_name

  • Вы хотите визуализировать некоторый текст только для вызовов ajax

    Используйте блок respond_to для достижения этой цели.Например.

    def whatever_action
    
      .... # Your action voodoo here
    
      respond_to do |format|
        format.html { ... } # If it a normal HTTP request
        format.js {...} # If it's an ajax or JSON request
      end
    end       
    

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

...