2010-06-06 8 views
0

Привет, ребята, мне было интересно, может ли кто-нибудь помочь мне, мне нужно очистить этот контроллер, потому что полученный код просто обновляет количество элементов, если он уже существует, кажется слишком сложным.Clean Up Controller, Update Item Количество в корзине

class LineItemsController < ApplicationController 
    def create 
    @product = Product.find(params[:product_id]) 
    if LineItem.exists?(:cart_id => current_cart.id) 
     item = LineItem.find(:first, :conditions => [ "cart_id = #{@current_cart.id}"]) 
     LineItem.update(item.id, :quantity => item.quantity + 1) 
    else 
    @line_item = LineItem.create!(:cart => current_cart, :product => @product, :quantity => 1, :unit_price => @product.price) 
    flash[:notice] = "Added #{@product.name} to cart." 
    end 
    redirect_to root_url 
end 
end 

`

Как всегда любая помощь очень ценится, код должен быть достаточно понятны, спасибо :)

PS разместил его здесь так же как это выглядит немного смешно здесь http://pastie.org/994059

+0

Возможно, вы должны быть немного более конкретными, лично я не буду увлекаться вопросами «очистить свой код». –

+0

@ Джозеф Сильваши, я не согласен. Это не «очищает мой код» так сильно, как «как я могу использовать рельсы лучше, чтобы мой код выглядел более чистым». Часть изучения лучшего программирования - это то, что кто-то показывает вам лучший способ сделать что-то. Карл достаточно проницателен, чтобы понять, что то, что он делает, может быть сделано как-то лучше. – DJTripleThreat

ответ

1

Я думаю, что вы ищете:

class LineItemsController < ApplicationController 
    def create 
    @product = Product.find(params[:product_id]) 
    item = LineItem.find_or_initialize_by_cart_id(:cart_id => current_cart.id, :cart => current_cart, :product => @product, :quantity => 0, :unit_price => @product.price) 
    item.increment! :quantity 
    flash[:notice] = "Added #{@product.name} to cart." 
    redirect_to root_url 
    end 
end 

Итак, что это такое, вызывается LineItem.find_by_cart_id(current_cart.id), и если он не существует, он создает его с переданными атрибутами. Одна проблема, о которой я не думаю, что вы можете обойти, - это обновление количества после вызова базы данных (либо нахождения -OR-create), так как вам нужно выяснить, был ли только что создан ресурс или он уже существует.

+1

Я бы использовал еще один атомный способ увеличить счетчик: item.increment! :количество. Ваша другая проблема легко решена find_or_initialize_by. Вы можете задать item.new_record? если ты заинтересован. – hurikhan77

+0

@ hurikhan77: отличная идея! Я по-прежнему относительно новичок в рельсах, поэтому я не знал о 'increment' или' find_or_initialize_by_' – DJTripleThreat

+0

Спасибо за все полезные комментарии и предложения :) –