shared partials error undefined方法`empty?'为零:NilClass

时间:2012-12-02 02:07:36

标签: ruby-on-rails model-view-controller local-variables renderpartial partials

我为应用购物车创建了部分( views / cart / _cart.html.erb )。我只在我的 views / layouts / application.html.erb 文件中呈现它。但是当我运行它时,除了 views / cart / _cart.index.erb 之外,我在每个页面上都会收到NoMethodError,我怀疑这是因为它与正在渲染的部分共享同一个控制器。

我一直在寻找答案和答案相信它与渲染部分时我传递变量的方式有关,如果有人可以看一下,我真的很感激吗?

所有代码均可在此处找到:https://github.com/rossmc/topsnowboards

我的部分代码( views / cart / _cart.html.erb )开始:

<% @cart = cart%>

<h1>Your Cart</h1>

<% if @cart.empty? %>
    <p>There is nothing in your shopping Cart</p>
<% end %>

<% total = 0 %>

<!-- More code displaying the rest of the cart omitted for brevity 

部分在 views / layouts / application.html.erb 中呈现:

<%= render :partial => "/cart/cart", :locals => { :cart => @cart } 

错误消息 Rails在我运行时向我抛出的是:

NoMethodError in Site#home

Showing Server Side/PROJ-Server Side/app/views/cart/_cart.html.erb where line #5 raised:

undefined method `empty?' for nil:NilClass

Extracted source (around line #5):

2: 
3: <h1>Your Cart</h1>
4: 
5: <% if @cart.empty? %>
6:  <p>There is nothing in your shopping Cart</p>
7: <% end %>
8: 

1 个答案:

答案 0 :(得分:1)

您在此处提到的代码中存在一些冗余。 @cart是一个实例变量,它应该对你的部分可用,而不需要将它作为本地传递(取决于你在第一个地方定义它的位置),所以你不需要第一行你的购物车部分。由于您在应用程序布局中呈现了部分购物车,因此它将在使用此布局的每个页面中呈现(通常是整个网站)。

您需要的是让@cart变量可用于您网站的每个网页(即每个控制器)。由于每个控制器都继承自ApplicationController,因此在那里定义@cart是有意义的。只需将before_filter添加到定义ApplicationController的{​​{1}}即可。通过代码快速浏览,我说这应该可以解决问题:

@cart