这里是初学者,请耐心等待。 :)
我部分地在我的views > products > index.html.erb
<div>
<table>
...
<tbody>
<%= render product %>
</tbody>
...
</table>
</div>
这是_product
部分:
<div>
<td>
<%= render "product_row", product: product, order_item: @order_item %>
</td>
</div>
..指向此_product_row
部分:
<div>
<%= form_for order_item, remote: true do |f| %>
<%= number_to_currency product.price %>
<%= f.number_field :quantity, value: 1, class: "form-control", min: 1 %>
<%= f.hidden_field :product_id, value: product.id %>
<%= f.submit %>
<% end %>
</div>
一切都很好,但我想在我的_product_row
中显示views > products > show.html.erb
。所以,我复制并粘贴它并得到这个错误:
NameError in Products#show
undefined local variable or method `product' for #<#<Class:...>
Extracted source:
<%= render "product_row", product: product, order_item: @order_item %>
...所以我进入我的products_controller
并将其放入:
def show
@product = Product.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @product }
end
end
'仍然是同样的错误。
任何帮助将不胜感激。
谢谢!
答案 0 :(得分:1)
您正在从index.html.erb
文件中呈现部分内容,如:
<%= render product %>
这里,product
变量未定义为视图文件中的局部变量。从控制器的索引操作传递产品变量作为实例变量,如@product
,或在index.html
页面中定义它。
或者,您可以这样做: 在 products_controller&gt;索引强>
def index
@products = Product.all
end
产品&gt;中的index.html.erb 强>
<% @products.each do |product| %>
<div>
<table>
...
<tbody>
<%= render product %>
</tbody>
...
</table>
</div>
<% end %>
答案 1 :(得分:1)
我猜您可能在index.html.erb
<% @posts.each do |post| %>
<%= render product %>
<% end %>
product
调用中的render
引用了您在迭代器块中定义的局部变量。
但是当您尝试将相同的代码复制/粘贴到show.html.erb
时,product
将被视为未定义,因为它不在循环中。
所以你应该使用以下内容:
<%= render @product %>
假设您必须在show.html.erb
行动中指定@product
,请在show
中。
答案 2 :(得分:0)
@Emu和@Dharam建议我把
<%= render @product %>
代替<%= render product %>
在我的产品show.html.erb
中,并确保在@product
中定义了products_controller.rb
,我做了:
def show
@product = Product.find(params[:id])
end
有效!不再有undefined
个错误。
_product_row
部分内容(请参阅上述问题中的原始代码)复制并粘贴到我的产品show
中,而不是渲染它。然后我根据Emu和Dharam的建议修改了一下。基本上它设法尝试将@
s错误地添加到未定义的位置:
<div>
<%= form_for @order_item, remote: true do |f| %>
<h4 style="font-family: 'Share Tech Mono', sans-serif;">The Small Price to Pay:
<span style="color: green">
<%= number_to_currency @product.price %>
</span>
</h4>
<h4 style="font-family: 'Share Tech Mono', sans-serif;">How many:</h4>
<div class="input-group">
<%= f.number_field :quantity, value: 1, class: "form-control", min: 1 %>
<div class="input-group-btn, add-to-cart-button">
<%= f.hidden_field :product_id, value: @product.id %>
<%= f.submit "ADD IT", class: "btn btn-danger" %>
</div>
</div>
<% end %>
</div>
然后将其添加到我的products_controller.rb
:
def show
@product = Product.find(params[:id])
@order_item = current_order.order_items.new
end
我希望这是有道理的。再次感谢所有人。 :)