2009-08-12 3 views
0

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

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

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

class PagesController < ApplicationController 
    # GET /pages/1 
    # GET /pages/1.xml 
    # Show is the main page rendering action, page routes are aliased in routes.rb 

    def show 
    #-+-+-+-+-Core Page Queries-+-+-+-+- 
    @page = Page.find(params[:id]) 
    @zones = @page.zones.find(:all, :order => 'zones.list_order ASC') 
    @mods = @page.mods.find(:all) 
    @columns = Page.columns 

    # restful params to influence page rendering, see routes.rb 
    @fragment = params[:fragment] # render single module 
    @cluster = params[:cluster]  # render single zone 
    @head = params[:head]   # render html, body and head 

    #-+-+-+-+-Page Level Json Conversions-+-+-+-+- 
    @metas = @page.metas ? ActiveSupport::JSON.decode(@page.metas) : nil 
    @javascripts = @page.javascripts ? ActiveSupport::JSON.decode(@page.javascripts) : nil 

    #-+-+-+-+-Module Specific Queries-+-+-+-+- 
    # would like to refactor this process 

    @mods.each do |mod| 
     # Reps Module Custom Queries 
     if mod.name == "reps" 
     @reps = User.find(:all, :joins => :roles, :conditions => { :roles => { :name => 'rep' } }) 
     end 
     # Listing-poc Module Custom Queries 
     if mod.name == "listing-poc" 
     limit = params[:limit].to_i < 1 ? 10 : params[:limit] 
     PropertyEntry.update_from_listing(mod.service_url) 
     @properties = PropertyEntry.all(:limit => limit, :order => "city desc") 
     end  
     # Talents-index Module Custom Queries 
     if mod.name == "talents-index" 
     @talent = params[:type] 
     @reps = User.find(:all, :joins => :talents, :conditions => { :talents => { :name => @talent } }) 
     end 
    end  

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @page.to_xml(:include => { :zones => { :include => :mods } }) } 
     format.json { render :json => @page.to_json } 
     format.css # show.css.erb, CSS dependency manager template 
    end 
    end 

    # for property listing ajax request 
    def update_properties 
    limit = params[:limit].to_i < 1 ? 10 : params[:limit] 
    offset = params[:offset] 
    @properties = PropertyEntry.all(:limit => limit, :offset => offset, :order => "city desc") 
    #render :nothing => true 
    end 
end 

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

ответ

0

Вы должны проверить этот камень:

http://github.com/josevalim/inherited_resources/tree/master

Это очень элегантный, и решает все проблемы, которые вы имеете.

+0

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

0

Я бы переместил ваши запросы, относящиеся к фрагментам, в вспомогательные методы и вытащил их из контроллера, чтобы сами фрагменты могли выполнять запрос через erb и сохраняли DRY и читаемы через помощника. Поэтому вместо того, чтобы ссылаться на @refs в вашем модуле, вы можете вместо этого ссылаться на find_all_refs или somesuch в модуле и выполнять это, и, возможно, memoize ответ.

+0

Это отличная идея, не знаю, почему я не думал переместить их в помощника. Просто переработал код и отлично работает. Просто нужно сейчас работать над кешированием запросов, не уверен, что memoization или || = будут работать в этом случае, нужно провести некоторое тестирование. Страницы отображаются примерно в 110 мс, поэтому я не слишком волнуюсь. Благодаря! –

Смежные вопросы