index.html.erb中的部分渲染不会在show.html.erb中显示

时间:2016-03-27 04:31:54

标签: ruby-on-rails render partial

这里是初学者,请耐心等待。 :)

我部分地在我的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

'仍然是同样的错误。

任何帮助将不胜感激。

谢谢!

3 个答案:

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

我希望这是有道理的。再次感谢所有人。 :)