2016-06-18 4 views
1

на моем электронный магазине сайте, когда я пытаюсь оформить мою тележку, я получаюнеопределенных «элементов» для нулевого класса

undefined method `items' for nil:NilClass. 

Хотя на странице ошибки

Error

I знаю, что моя корзина есть ... но когда я это называю, это дает мне ноль

toggle session dumb

Корзина Модель

class Cart 
    attr_reader :items 

    def self.build_from_hash hash 
     items = if hash["cart"] then 
     hash["cart"]["items"].map do |item_data| 
     CartItem.new item_data["product_id"], item_data["quantity"] 
     end 
     else 
     [] 
     end 
     new items 
    end 

    def initialize items = [] 
    @items = items 
    end 

    def add_item product_id 
     item = @items.find { |item| item.product_id == product_id } 
     if item 
     item.increment 
     else 
     @items << CartItem.new(product_id) 
     end 
    end 

    def empty? 
     @items.empty? 
    end 

    def count 
     @items.length 
    end 

    def serialize 
     items = @items.map do |item| 
     { 
      "product_id" => item.product_id, 
      "quantity" => item.quantity 
     } 
     end 
     { 
     "items" => items 
     } 
    end 

    def total_price 
     @items.inject(0) { |sum, item| sum + item.total_price } 
    end 


end 

Контроллер Применение

 def initialize_cart 
     @cart = Cart.build_from_hash session 
    end 

Корзина Контроллер

class CartsController < ApplicationController 
    before_filter :initialize_cart 

    def add 
    @cart.add_item params[:id] 
    session["cart"] = @cart.serialize 
    product = Product.find params[:id] 
    redirect_to :back, notice: "Added #{product.name} to cart." 
    end 

    def show 
    end 

    def checkout 
    @order_form = OrderForm.new user: User.new 
    end 
end 

Заказать Контроллер

class OrdersController 
    def create 
     @order_form = OrderForm.new(
     user: User.new(order_params[:user]), 
     cart: @cart 
    ) 
     if @order_form.save 
     redirect_to '/', notice: "Thank you for placing your order." 
     @cart.empty? 
     else 
     render 'carts/checkout' 
     end 
    end 

Оформить Просмотр

<div class="container-checkout"> 
    <p class="text-title"> You are checking out the following: </p> 
     <table class="table table-striped"> 
     <thead class="name-table"> 
      <tr> 
      <td> Image </td> 
      <td> Name </td> 
      <td> Category</td> 
      <td> Size </td> 
      <td> Item Price </td> 
      </tr> 
     </thead> 
     <tbody> 

     <% @cart.items.each do |item| %> 

     <tr> 
      <td><img src="<%= item.product.image %>" width="50px"></td> 
      <td><%= item.product.name.capitalize %></td> 
      <td><%= item.product.category.name %></td> 
      <td><%= item.product.size %></td> 
      <td class="price-item"><%= number_to_currency item.total_price %> 
     </td> 
     <% end %> 
     </tr> 
     <tr class="total-price total-price-checkout"> 
     <td class="name-table">Total Price</td> 
     <td class="price-item"><%= number_to_currency @cart.total_price %></td> 
     </tr> 
    </tbody> 
    </table> 

</div> 


<div class="details-user-form"> 
    <%= form_for @order_form, url: orders_path do |f|%> 
    <% f.fields_for :user, @order_form.user do |u| %> 
    <p class="text-title">Fill the form with your details</p> 
    <p><%= render "orders/errors" %></p> 
    <p><%= u.text_field :name, placeholder: "Name" %></p> 
    <p><%= u.text_field :email, placeholder: "Email" %></p> 
    <p><%= u.text_field :address, placeholder: "Address" %></p> 
    <p><%= u.text_field :postal_code, placeholder: "Postal code" %></p> 
    <p><%= u.text_field :city, placeholder: "City" %></p> 
    <p><%= u.text_field :country, placeholder: "Country" %></p> 
    <%= f.submit "Place order", class: "order-btn"%><br> 
    <% end %> 
<% end %> 
</div> 

Любая идея, почему это так? Кроме того, потому что он работал раньше. Я не знаю, почему он остановился.

+0

Вы могли бы показать весь контроллер, особенно ту часть, которую задает переменная '@ cart'? – oreoluwa

ответ

1

Я думаю, проблема может заключаться в том, что переменная @cart не установлена ​​в OrdersController. Установка переменной в CartsController не делает ее доступной по всему миру, так как она будет привязана только к контроллеру, который ее создал, в вашем случае CartsController.

Кроме того, я вижу, что ваша Cart модели более виртуальная модель, чем в ActiveRecord модели, является то, что поведение, которое вы искали, как я считаю, ActiveRecord уже есть много методов, вы воссоздающие там.

Я не совсем уверен, но я думаю, что это могут быть проблемы.

UPDATE

Я думаю, что я нашел свою ошибку.

В вашей OrdersController вы должны иметь

before_action :initialize_cart 

Это, кажется, исходящее от ApplicationController

1

Если вы проверяете метод checkout в вашем CartController, вы увидите, что вы не установили @cart. Поэтому, когда вы нажмете вид checkout, в этом методе приходит поиск значения или @cart. Установка там, как и код ниже, должна очистить вашу ошибку.

def checkout 
    @order_form = OrderForm.new user: User.new 
    @cart = # cart object 
end