我想在application.html.erb中渲染一部分内容。部分来自Product文件夹"产品/类别"。当我尝试在application.html.erb中插入partial时,如下所示,我得到未定义的局部变量或方法`categories'对于#<#: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
答案 0 :(得分:1)
使用你的渲染
locals: { categories: categories }
将在您的部分
中定义categories
但在某种程度上,你指的是@categories
。
即使您没有将它们作为区域设置传递,您仍然可以访问部分中的所有实例变量。
另请注意,控制器方法不会自动用于视图。
您还需要在控制器中编写helper_method :categories
或将方法移动到帮助文件。
尽管将局部变量命名为方法可能不是一个好主意,因此您应该将方法重命名为get_categories
或其他东西。
答案 1 :(得分:0)
您将区域设置作为locals: { categories: categories }
作为局部变量传递,并且在视图中您调用的实例变量@categories将无法进入该视图。
尝试将区域设置作为locals: { categories: @categories }
传递并在视图中使用
<% categories.each do |category| %>
答案 2 :(得分:0)
尝试遵循:切勿在部分中使用实例变量。
将变量传递给partial。您可以使用render
简写代替render partial
,这样可以更容易阅读。
<%= render "products/categories", categories: @categories %>
# app/views/products/categories
<% categories.each do |category| %>
<li><%= category %></li>
<% end %>
答案 3 :(得分:0)
如果想将params传递给partial,则需要添加partial:
。另外,您在locals
中错过拼写错误,将其设为@categories
。
<%= render partial: 'products/categories', locals: { categories: @categories }%>
并在没有@
<% categories.each do |category| %>
<li><%= category %></li>
<% end %>