传入部分

时间:2016-10-03 05:33:59

标签: ruby-on-rails ruby

我想在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

4 个答案:

答案 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 %>