2016-10-03 30 views
0

我想在我的application.html.erb中渲染部分内容。部分源自产品文件夹“产品/类别”。当我尝试在application.html.erb中插入一个部分时,如下所示,我得到#<#:0x007fcfa35c9c78>的未定义局部变量或方法`类别'。任何帮助是极大的赞赏。传入部分对象

application.html.erb

<%= render 'products/categories', locals: { categories: categories }%> 

产品/ _categories.html.erb

<% @categories.each do |category| %> 
<li><%= category %></li> 
<% end %> 

products_controller.rb

def categories 
    @categories = ProductCategory.all 
end 

回答

1

随着渲染你有

locals: { categories: categories } 

它将在您的部分中定义categories

但是在这部分中您指的是@categories

即使您不将它们作为区域设置传递,您仍然可以访问部分中的所有实例变量。

另请注意,控制器方法不会自动提供给视图。

您还需要在控制器中写入helper_method :categories或将该方法移至助手文件。

尽管将方法命名为局部变量可能不是一个好主意,因此您应该将方法重命名为get_categories或其他。

+0

我最后做的是刚刚创建的helper方法,并在_categories.html.erb引用它。我无法得到任何其他工作。 – RickD

0

您正在将区域设置为locals: { categories: categories }作为局部变量传递,并且鉴于您调用的实例变量@categories不会进入该视图。 试图通过语言环境locals: { categories: @categories },并考虑使用

<% categories.each do |category| %> 
0

尽量遵循:不要在局部使用实例变量。

将变量传入部分。您可以使用render简写,而不是render partial,这使得它更易于阅读。

<%= render "products/categories", categories: @categories %>

# app/views/products/categories 
<% categories.each do |category| %> 
<li><%= category %></li> 
<% end %> 
+0

谢谢,但我不能得到它的工作使用辅助方法。 – RickD

0

您需要添加partial:如果想通过PARAMS局部。另外,您错过了错字locals,使它@categories

<%= render partial: 'products/categories', locals: { categories: @categories }%> 

和循环它不@

<% categories.each do |category| %> 
<li><%= category %></li> 
<% end %> 
+0

谢谢,但我不能得到它的工作使用辅助方法。 – RickD