2015-07-21 155 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