未定义的方法' name'对于nil:NilClass,但我知道记录存在

时间:2015-12-29 23:10:29

标签: ruby-on-rails session activerecord

我正在尝试根据会话构建一个简单的购物车。我使用此youtube教程作为模板:vid#4 https://www.youtube.com/watch?v=WRVwfVUaj_Y和vid#5 https://www.youtube.com/watch?v=HSMqi913SL4

我得到了与他在vid#5中获得的相同的错误,但是他并没有表明他是如何修复它的。

以下是我的路线:

get '/cart' => 'cart#index'
get '/cart/clear' => 'cart#clearCart'
get '/cart/:id' => 'cart#add'

这是我的cart_controller.rb:

class CartController < ApplicationController

  def add
    id = params[:id]

    if session[:cart] then
      cart = session[:cart]
    else
      session[:cart] = {}
      cart = session[:cart]
    end

    if cart[id] then
      cart[id] = cart[id] + 1
    else
      cart[id] = 1
    end

    redirect_to :action => :index
  end

  def clearCart
    session[:cart] = nil
    redirect_to :action => :index
  end

  def index


    if session[:cart] then
      @cart = session[:cart]
    else
      @cart = {}
    end
  end
end

这是我的cart / index.html.erb页面:

<h3>Your Shopping Cart</h3>

<%= link_to "Empty Your Cart", cart_clear_path %>

<% total = 0 %>

<% @cart.each do | id, quantity | %>
    <% product = Product.find_by_id(id)%>

<div class="row">
    <div class="col-lg-3 col-md-3 col-sm-6 col-xs-12" >

        <div class="product_text">
            <h3><%= product.name %></h3>
            <h3><%= product.description %></h3>
            <h3>$<%= product.price %></h3>


        </div>  
    </div>
</div>

<%end%>

我很困惑,因为我知道Product对象存在,但我仍然在标题中收到错误。

2 个答案:

答案 0 :(得分:1)

您可以尝试在添加

后将购物车变量分配回会话
def add
  id = params[:id]
  cart = session[:cart] || {}
  cart[id] = 0 unless cart[id]
  cart[id] = cart[id] + 1
  session[:cart] = cart
  redirect_to :action => :index
end

BTW我不认为是否应该包含在语言中

def index
  @cart = session[:cart] || {}
end

修改

我处理产品的方式是在控制器中。我对在视图中看到模型有所保留。我不确定这是否是一种设计模式,但我会将一系列产品传递给视图而不是一组数组来查找。我知道这有助于代码的测试能力。

# app/controllers/cart_controller.rb  #should be carts_controller for RAILS convention
def index
  @cart = []
  session[:cart].each do |product_id, qty|
    @cart << {product: Product.find(product_id) , qty: qty}
  end
end    

仅在@cart.each do |c| <%=c.product.name %> <%=c.qty %>

视图中使用此功能

答案 1 :(得分:0)

感谢大家的帮助,但我找到了解决方案。在我将其传递给find_by_id之前,我需要使用.gsub(&#39;&#39;&#39;&#39;&#39;&#39;)清理ID。

这有效:

<% @cart.each do | id , qty | %>
<% p = Product.find_by_id(id.gsub('"', '')) %>
<%= p.name %> <%= qty %>
<%end%>