我想如何以最佳方式重构这个控制器上的一些建议。控制器构建一个区域和模块的页面。页面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
所以想象一个网站有一百个模块和几十个额外的控制器动作。我认为大多数人都会同意,如果我能够将代码移出并重构它以更像配置,它将会更加清洁。
我不认为这会很好地为控制器的工作,但我打算把它用在我的管理控制器,是什么,但干的。谢谢你的提示! – 2009-08-16 01:07:15