редактировать контент в корзине ruby ​​on rails - PullRequest
0 голосов
/ 12 сентября 2009

Я пытаюсь создать простую корзину для покупок с направляющими, теперь я могу добавлять товары в корзину, я хочу знать, как я могу редактировать товары, пока они в корзине, я использую сеансы для контроля товаров в покупках корзина. Вот что видит пользователь, добавляя в корзину:

<% @cart.items.each do |item| %>
<tr>
    <td>
        <%= image_tag item.pic , :alt => "#{item.title}" %>
    </td>
    <td>
        <%= link_to "#{item.title}" , store_path(item.product_id) %>
    </td>
    <td>
        <%= item.unit_price %>
    </td>
    <td>
        <%= item.quantity %>
    </td>
    <td>
        <%= item.total_price %>
    </td>
    <% end %>
</tr>

и это класс CartItem:

class CartItem

  attr_reader :product, :quantity

  def initialize(product)
    @product = product
    @quantity = 1
  end

  def increment_quantity
    @quantity += 1
  end

  def product_id
    @product.id
  end

  def title
    @product.name
  end

  def pic
    @pic = @product.photo.url(:thumb)
  end

  def unit_price
    @product.price
  end

  def total_price
    @product.price * @quantity
  end

end

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

Ответы [ 2 ]

0 голосов
/ 17 января 2010

Хороший вопрос. Мне удалось заставить функцию удаления работать. Похоже, вы следите за прагматичными программистами Agile Web Development с Rails , третье издание.

Вот и мы ...

To add_to_cart.html.erb

Я добавил следующую строку таблицы рядом с последней позицией tr:

<td><%= link_to 'remove', {:controller => 'inventories', :action => 'remove_cart_item', :id => "#{item.getinventoryid}"} %></td>

В модель CartItem.rb

изменено attr_reader: инвентарь,: количество до attr_accessor :inventory, :quantity

def getinventoryid
   @inventory.id
end

Для модели Cart.rb:

изменено attr_reader: элементы на attr_accessor :items

def remove_inventory(inventory)
   @items.delete_if {|item| item.inventory == inventory }
end

Inventories_controller.rb:

def remove_cart_item
  inventory = Inventory.find(params[:id])
  @cart = find_cart
  @cart.remove_inventory(inventory)
  redirect_to_index("The item was removed")
 end
0 голосов
/ 12 сентября 2009

Ну, у вас уже есть что-то настроенное в тесной манере. У вас есть метод increment_quantity в вашей модели элемента корзины, поэтому вам нужно настроить модель корзины, чтобы вы могли указать продукт, а затем вызвать новый метод, например:

cart.rb (при условии, что это модель вашей корзины)

def increment_product_quantity(id, quantity)
   product_to_increment = @items.select{|product| product.product_id == id}

   # We do this because select will return an array
   unless product_to_increment.empty?
      product_to_increment = product_to_increment.first
   else
      # your error handling here
   end

   product_to_increment.quantity = quantity
end

def remove_product(id)
   @items.delete_if {|product| product.product_id == id }
end

Теперь вам нужно изменить модель элемента корзины, чтобы количество было не объектом attr_reader, а объектом attr_accessor, или создать метод для элементов корзины, специально для которого вы устанавливаете количество; ваш выбор.

Есть еще несколько вещей, которые можно сделать, но это примерно самый простой и чистый метод, который я могу порекомендовать прямо сейчас.

...