2015-05-19 196 views
1

我有3個控制器Rails應用程序渲染:呼叫從另一個控制器

categoriessubcategoriesall

的兩個第一取從DB數據,並經由

渲染它最後一個應該得到第一個控制器的結果,第二個控制器的結果並渲染它們。

簡單的例子:

# categories_controller.rb 
class CategoriesController < ApplicationController 
    def index 
     render "list" 
    end 
end 

# subcategories_controller.rb 
class SubcategoriesController < ApplicationController 
    def index 
     render "list" 
    end 
end 

# all_controller.rb 
class AllController < ApplicationController 
    def index 
     # should render the both and join them 
    end 
end 

# list.html.erb 
this is the list 

結果:

/category 
=> "this is the list " 

/subcategory 
=> "this is the list " 

/all 
=> "this is the list this is the list " 

席力圖召

render "subcategory" 
render "subcategory/index" 

但似乎沒有任何工作。

你有什麼想法嗎?

感謝,


先前的做法是以下幾點:

# categories_controller.rb 
class CategoriesController < ApplicationController 
    def self.getAll 
     return Category.all 
    end 
    def index 
     @data = CategoriesController.getAll 
     # some logic here 
     render "list" 
    end 
end 

# subcategories_controller.rb 
class SubcategoriesController < ApplicationController 
    def self.getAll 
     return Category.all 
    end 
    def index 
     @data = SubcategoriesController.getAll 
     # some logic here 
     render "list" 
    end 
end 

# all_controller.rb 
class AllController < ApplicationController 
    def index 
     @categoriesData = CategoriesController.getAll 
     @subcategoriesData = SubcategoriesController.getAll 
     render 'all' 
    end 
end 

# list.html.erb 
<%= @data %> 

# all.html.erb 
<%= @categoriesData %> 
<%= @subcategoriesData %> 

但我不得不重寫已經存在邏輯的一部分...

+0

你不能在控制器中渲染兩次,我不認爲。爲什麼不使用partials和subcategory,然後在所有控制器索引操作中將它們都渲染到視圖中? –

+0

我嘗試使用'render_to_string'方法,然後合併這兩個。一個已經存在的部分,這個例子是爲了簡化問題,但如果你認爲它是值得的,我可以更新它。 – nobe4

回答

3

您需要顯式構建在all控制器操作中需要的輸出,而不是嘗試連接其他操作的輸出。

兩種方法:

  1. 獲取你需要的產品有兩個數據庫調用,將它們連接在一起成一個大組的列表項,然後渲染列表作爲其他行動。

    class AllController < ApplicationController 
        def index 
         categories = Categories.all 
         sub_categories = Subcategories.all 
         @all = categories + sub_categories 
        end 
    end 
    
  2. 檢索這兩組數據,使list.html頁面中調用的部分稱爲_sub_list.html什麼的,然後有針對all頁面調用all.html,這使得新的部分兩次,一次爲每個組的新模板數據。

    class AllController < ApplicationController 
        def index 
         @categories = Categories.all 
         @sub_categories = Subcategories.all 
        end 
    end 
    

要重新使用跨控制器邏輯。使用一個問題:

module SharedLogic 
    extend ActiveSupport::Concern 

    def useful_function 
    # some code... 
    end 
end 

class SubcategoriesController < ApplicationController 
    include SharedLogic 

    def index 
    @data = SubcategoriesController.getAll 
    # some logic here 
    useful_function 

    render "list" 
    end 
end 
+0

你的1.是我的第一個方法,我有一個'all.html.erb',用對象中的所有數據調用,然後從這裏渲染其他部分。但是我想從兩個控制器中重用一部分邏輯。所以我認爲直接使用他們的反應(就像我使用它們一樣)是一種更好的方法。 – nobe4

+0

在控制器中使用單獨的功能來共享邏輯。更好的是,使用服務對象:https://sporto.github.io/blog/2012/11/15/a-pattern-for-service-objects-in-rails/ –

+0

閱讀文章,同時我更新了我的問題與我以前的方法 – nobe4