簡體   English   中英

重構此Rails控制器的最佳方法是什么?

[英]What's the best way to refactor this Rails controller?

我想要一些有關如何最佳重構此控制器的建議。 控制器將建立一個區域和模塊頁面。 頁面has_many區域,區域has_many模塊。 因此,區域僅僅是包裝在容器中的一組模塊。

我遇到的問題是某些模塊可能有一些我不想在每個頁面上執行的特定查詢,因此我不得不添加條件。 條件只是測試模塊是否在頁面上(如果執行了查詢)。 問題之一是,如果我添加一百個特殊的模塊查詢,則控制器必須遍歷每個查詢。

我想我希望看到這些模塊狀態移出控制器以及所有其他自定義動作。 我可以將所有內容都保留在一個控制器中,但我計划使用該控制器來使用許多應用程序,以免混亂。

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

因此,假設一個站點有一百個模塊,並包含數十個其他控制器操作。 我認為大多數人都同意,如果我可以移出該代碼並將其重構為更像配置的行為,它將更加干凈。

您應該檢查以下寶石:

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

它非常優雅,可以解決您遇到的所有問題。

我會將您特定於代碼段的查詢移到幫助程序方法中,並將其移出控制器,以便代碼段本身可以通過erb執行查詢,並通過幫助程序保持DRY和可讀性。 因此,您可以在模塊中引用find_all_refs或類似的東西,而不是在模塊中引用@refs,而是執行並可能記住響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM