2015-07-21 159 views
0

我是RoR的新手,我对Rails MWC有点困惑。我觉得我误解了一些东西。Ruby on Rails布局和渲染

例如,我想有主页,我可以呈现前5名的文章和前5个产品。产品和文章完全没有关系,它是完全独立的数据。

所以我尝试做的是,我笼子2个sacffolds产品和物品,以及1个控制器主页。我根源于主页控制器。然后在主页模板中,我尝试渲染产品和文章模板。我得到一个错误,即产品和物品控制器中使用的方法未定义。

我不明白的地方是问题。这种模板在另一个模板中渲染一个模板不是Rails约定。或者我的代码中有错误。

+0

如果一个模板使用数据,比方说,'@ articles',它必须被初始化在控制器中。在你的情况下,它似乎是'HomeController'。另外两个控制器没有被执行,因此对模板没有影响。 –

回答

1

我没有看到你的代码,但在这种情况下,我敢肯定你有虫子在里面。

应用程序/控制器/ home_controller.rb

class HomeController < ApplicationController 

    def index 
    @products = Product.top5 # Your logic to fetch top 5 
    @articles = Article.top5 
    end 

end 

应用程序/视图/家庭/ index.html.erb

<% @products.each do |product| %> 
    <%= product.name %> 
<% end %> 
<% @articles.each do |article| %> 
    <%= article.name %> 
<% end %> 

这是完全正常的,我已经做了多次。考虑到Rails中你没有控制器和模型之间的关系,也有约定,但Rails的控制器完全不绑定到任何模型

1

首先,您需要在控制器方法上实例化变量@products@articles(这是一个示例)。然后你可以渲染视图。

留意过添加@。渲染视图中只有变量@可用。

默认情况下,当您拨打/products的GET时,您将到达index方法。在此方法结束时,如果未指定任何视图,则Rails将呈现views/products/index。在这个视图中,你将访问所有的变量,用@实例化,并做任何你想要的。

1

首先,是的,一个模板渲染另一个控制器的模板(不是部分)是不在Rails约定中。 脚手架是一种“单一资源”控制器:它需要您的模型定义并生成一个基本控制器来编辑和显示该特定模型(即Product)。 你真正需要做的是使用你的主页控制器已经产生的两种模式,有点像这样:

class HomePageController < ApplicationController 
    def index 
    @articles = Article.top_5 
    @products = Product.top_5 
    # Render the @articles and @products in the view. 
    end 
end