2011-10-03 45 views
2

我希望這個問題不是太主觀,但在這裏。正確的方式來組織控制器與嵌套資源(導軌)

爲了簡單起見,我有一個包含許多嵌套資源的用戶模型。例如,@user有許多@book,@cars,@friends。

在用戶的「顯示」視圖中,我向用戶顯示了一個儀表板,該儀表板顯示了所有事物(書籍,汽車和朋友)的小部件。

現在我的問題是,UsersController必須做任何/所有有關書籍,汽車和朋友的邏輯。把Books等邏輯放在UsersController中只是感覺不對。

+0

邁克現在我有同樣的問題。你有沒有找到一種體面的方式來組織你的控制器而不用重寫所有的嵌套路由來指向不同的控制器動作? – Omar

+0

我最終使用的解決方案是通過ajax加載每個小部件(書籍/汽車/朋友),使用嵌套路線(I.E/users/8/books)指向該小部件自己的控制器。這在實施過程中感覺有點不好,但從設計意義上來說很乾淨。 – CambridgeMike

+0

打算髮布我在評論中所做的,但想向您展示一些代碼。 – Omar

回答

1

在軌您可以在路由使用嵌套的資源,像這樣

resources :users do 
    resources :books 
end 

這將使你像

/users/id_of_user/books 

這將打擊你的書控制器的索引,只需檢查USER_ID可用性在您的書籍控制器中,並獲取附加到當前用戶的所有書籍(如果存在)。

使用您的控制器並通過這種方式進行佈線,您可以輕鬆地將您的邏輯傳播到更適合的控制器,並使其遠離用戶控制器。

查看下面的文檔以獲取更多信息,例如新嵌套路徑的snazy helpers。 http://guides.rubyonrails.org/routing.html#nested-resources

+1

我同意路由中的嵌套資源是一種將數據傳遞給控制器​​的非常乾淨的方式。但是我仍然會遇到這樣的問題:我的用戶控制器正在爲書籍,汽車,朋友等做很多繁重的工作。 – CambridgeMike

-1

評論後不久,我在Rails指南上找到了:before_filter。使用它,您可以根據是否找到嵌套資源以及相關模板來調用操作。這就是我所做的,對我來說效果很好!

before_filter :user_resource 

     def user_resource 
     return unless params[:user_id] 
     redirect_to root_url and return unless params[:user_id] == current_user.id.to_s 
     action = :"user_#{params[:action]}" 
     if self.methods.include? action 
      self.send action 
      render action 
     end 
     end 

和方法的一個實例調用

def user_index 
    ads = Classified.where(:owner_id => params[:user_id]) 
    @classifieds = ads 
    end