2011-08-12 69 views
3

我的應用程序中有這個非常大的控制器。我真的很想盡可能地瘦。下面是一些代碼,顯示了我目前正在做的事情的類型。我想知道我可以從中移出哪些東西?在rails 3中製作胖控制器瘦身

注意 - 這不是我確切的代碼,它有很多相似之處。基本上每個實例變量都用在視圖中 - 這就是爲什麼我不明白如何將邏輯放入模型中?模型可以返回實例變量的值嗎?

def mine 

    #For Pusher 
    @push_ch = "#{current_user.company.id}"+"#{current_user.id}"+"#{current_user.profile.id}" 

    #Creating a limit for how many items to show on the page 
    @limit = 10 
    if params[:limit].to_i >= 10 
     @limit = @limit + params[:limit].to_i  
    end 

    #Setting page location 
    @ploc="mine" 

    @yourTeam = User.where(:company_id => current_user.company.id) 
    #Set the user from the param 
    if params[:user] 
     @selectedUser = @yourTeam.find_by_id(params[:user]) 
    end 

    #Get all of the user tags 
    @tags = Tag.where(:user_id => current_user.id)  

    #Load the user's views 
    @views = View.where(:user_id => current_user.id) 

    if !params[:inbox] 

     #Hitting the DB just once for all the posts 
     @main_posts = Post.where(:company_id => current_user.company.id).includes(:status).includes(:views) 
     @main_posts.group_by(&:status).each do |status, posts| 
      if status.id == @status.id 
      if @posts_count == nil 
       @posts_count = posts 
      else 
       @posts_count = @posts_count + posts 
      end 
      elsif status.id == @status_act.id 
      if @posts_count == nil 
       @posts_count = posts 
      else 
       @posts_count = @posts_count + posts 
      end 
      end 
     end 

     if params[:status] == "All" || params[:status] == nil 
      @posts = Post.search(params[:search]).status_filter(params[:status]).user_filter(params[:user]).order(sort_column + " " + sort_direction).where(:company_id => current_user.company.id, :status_id => [@status.id, @status_act.id, @status_def.id, @status_dep.id, @status_up.id]).limit(@limit).includes(:views) 
     else 
      @posts = Post.search(params[:search]).status_filter(params[:status]).user_filter(params[:user]).order(sort_column + " " + sort_direction).where(:company_id => current_user.company.id).limit(@limit).includes(:views) 
     end 

    elsif params[:inbox] == "sent" 

     @yourcompanylist = User.where(:company_id => current_user.company.id).select(:id).map(&:id) 
      @yourcompany = [] 
      @yourcompanylist.each do |user| 
      if user != current_user.id 
      @[email protected]([user]) 
      end 
      end 

      if params[:t]=="all" 
      @posts = Post.search(params[:search]).status_filter(params[:status]).user_filter(params[:user]).tag_filter(params[:tag], current_user).order(sort_column + " " + sort_direction).where(:user_id => current_user.id).includes(:views, :tags).limit(@limit) 
      elsif params[:status]!="complete" 
      @posts = Post.search(params[:search]).status_filter(params[:status]).user_filter(params[:user]).tag_filter(params[:tag], current_user).order(sort_column + " " + sort_direction).where(:user_id => current_user.id).includes(:views, :tags).limit(@limit) 
      elsif params[:status]!=nil 
      @posts = Post.search(params[:search]).status_filter(params[:status]).user_filter(params[:user]).tag_filter(params[:tag], current_user).order(sort_column + " " + sort_direction).where(:user_id => current_user.id).includes(:views, :tags).limit(@limit) 
      end 

    end 

    respond_to do |format| 
     format.html # index.html.erb 
     format.js # index.html.erb 
     format.xml { render :xml => @posts } 
    end 
    end 
+0

你可以使用的模塊,包括適當的方法 – sushant

回答

4

您可以通過移動邏輯到模型中開始...

像這樣的一條線讓人羨慕:

@push_ch = "#{current_user.company.id}"+"#{current_user.id}"+"#{current_user.profile.id}" 

我會推薦它移動到模型:

#user.rb 
def to_pusher_identity 
    "#{self.company_id}#{self.id}#{self.profile_id}" 
end 

然後在你的控制器

@push_ch = current_user.to_pusher_identity 

在這一點上,你甚至可以移動到這一個before_filter

before_filter :supports_pusher, :only => :mine 

你可以做的另一件事是創建更豐富的聯想,所以你可以表達:

@tags = Tag.where(:user_id => current_user.id)  

@tags = current_user.tags 

另一個例子是不是

的主要崗位,
Post.where(:company_id => current_user.company.id).includes(:status).includes(:views) 

你會去通過協會:

current_user.company.posts.includes(:status).includes(:views) 
+0

是否有這樣的協會的好處 - 或者只是「軌道方式」這麼說? – Elliot

+0

這就是導軌的方式,但它更簡潔,不易出錯。 – jonnii

2

當我曬出一個控制器/動作我試圖找出可能是什麼樣的代碼卸載到模型,甚至一個新的模塊(應該是什麼?)。我對您的應用程序不夠了解,無法確定這些機會可能存在的位置,但這就是我要開始的地方。

+0

在我將決定什麼情況下的代碼應該在一個模塊,而不是一個控制器或模型? – Elliot

+0

這是一個艱難的呼籲。如果你有一個與特定模型無關的業務邏輯/行爲體,或者可能代表可能進入模塊的許多不同控制器行爲共有的東西。我的方法是,控制器應該基本上將編組請求放入各種模型中,並返回到視圖,而不是執行許多複雜的業務邏輯。 – jaydel

+0

這裏有一個更好的問題 - 讓我說我覺得上面的所有代碼都應該在模型中 - 如果我需要那些實例變量仍然具有視圖的值,我該如何將它移入它? – Elliot

2

幾個簡單的想法:

考慮使用respond_to/respond_with。這個控制器動作可以分成兩個獨立的 - 一個用於顯示 @main_posts,另一個用於 params [:inbox] ==「發送」。可以使用 before_filters刪除重複的代碼。

此外,一對夫婦的寶石建議:

相關問題