2009-08-12 97 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

我不认为这会很好地为控制器的工作,但我打算把它用在我的管理控制器,是什么,但干的。谢谢你的提示! – 2009-08-16 01:07:15

0

我将你的特定片段查询到辅助方法,让他们走出控制器,使得片段本身可以通过执行该局查询,并保持干燥和可读性通过帮手。因此,而不是指@refs你的模块中,可以改为参考find_all_refs或一个模块中诸如此类,并且具有执行,并可能memoize的响应。

+0

这是一个好主意,不知道为什么我没有想到把他们变成帮手。只是重构了代码并且工作得很好。现在只需要处理查询缓存,不确定memoization或|| =是否可以在这种情况下工作,需要做一些测试。页面在大约110ms内渲染,所以我并不担心。谢谢! – 2009-08-16 01:29:35

相关问题