从另一个控制器调用渲染

时间:2015-05-19 09:17:10

标签: ruby-on-rails ruby controller render

我有一个带3个控制器的rails应用程序:

categoriessubcategoriesall

这两个第一次从数据库中获取数据并通过

进行渲染
render "list"

最后一个应该得到第一个控制器的结果,第二个控制器的结果并渲染它们。

简化示例:

# 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 %>

但是我必须重写已经存在的逻辑的一部分......

1 个答案:

答案 0 :(得分: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或其他内容,然后为名为{{1}的all页面设置新模板},为每组数据渲染两次新的部分。

    all.html
  3. 跨控制器重用逻辑。使用一个问题:

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