Вопрос о создании корзины покупок / оформлении заказа с помощью Rails - PullRequest
3 голосов
/ 09 ноября 2008

Я только что взял Agile Web Development с Rails, 3-е издание, и я перейду к главам приложения Depot, и у меня возник вопрос по поводу опций Product / Item-

Если бы я захотел изменить каталог товаров и сохранить их так, чтобы у продуктов были варианты (размер, цвет и т. Д.), Где и как мне это сделать?

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

Но каждая кнопка «Добавить в корзину» обернута тегом формы, автоматически генерируемым button_to, и, похоже, не дает мне возможности передавать дополнительные параметры в мою корзину. Как я могу получить размер элемента, добавленного в POST для add_to_cart?

И, возможно, еще важнее - Какой самый Railsy способ сделать это?

Заранее спасибо за любую помощь! --Mark

Помощник на мой взгляд:

<%= button_to "Add to Cart" , :action => :add_to_cart, :id => product %>

Форма, которую он генерирует:

<form method="post" action="/store/add_to_cart/3" class="button-to">

Ответы [ 4 ]

4 голосов
/ 11 ноября 2008

Хорошо, это через 2 дня, и я понял это. Это то, что я должен был сделать -

1, в моем представлении магазина:

<% form_for @product, :url => {:action => "add_to_cart", :id => @product} do |f| %>
  <select name="productsize" id="productsize">
    <option value="L">L</option>
    <option value="XL">XL</option>
  </select>
  <%= f.submit 'Add to Cart' %>
<% end %>

2, добавлено в мой контроллер магазина:

productsize = params[:productsize]
@cart.add_product(product, productsize)

Нужно было получить размер продукта из параметров, а затем передать его вместе с остальной частью модели продукта в действие add_product модели корзины.

3, скорректировал модель корзины, чтобы принять аргумент, и:

@items << CartItem.new(product, productsize)

Передал его вместе с остальной частью модели продукта, чтобы создать новый элемент корзины и добавить его к элементам.

4, добавлено в модель cart_item:

attr_reader :product, :quantity, :productsize

def initialize(product, productsize)
@product = product
@productsize = productsize

чтобы прочитать в productize и инициализировать элемент корзины.

5, добавлено в мое представление add_to_cart:

Size: <%=h item.productsize %>

Чтобы отобразить его для пользователя.

Вот и все. Если есть более простой или СУХОЙ способ сделать это, у меня все уши (глаза?).

1 голос
/ 10 ноября 2008

Я не уверен, почему вы не сохраните размер, если вы не имеете в виду, что вы будете хранить размер как часть cart_item, а не продукт, что было бы хорошо. В этом случае вы бы сделали что-то вроде этого:

<% form_for(@cart_item) do |f| %>
<%= f.select :size, ['S', 'M', 'L', 'XL', 'XXL'] %>
<%= f.hidden_field :product_id, :value => @product.id %> 
# other properties...
<%= f.submit 'Add to Cart' %>
<% end %>
0 голосов
/ 10 ноября 2008

Вам нужно будет добавить атрибуты к вашей модели. Для этого вам нужно будет создать миграцию, чтобы обновить таблицу базы данных. У меня есть только 2-е издание книги, но есть раздел «Итерация A2: добавить отсутствующий столбец», в котором описывается, как это сделать. Я предполагаю, что аналогичный раздел будет в 3-м издании.

После этого вы можете следовать предложению Can Berk Güder и заменить кнопку на форму.

0 голосов
/ 09 ноября 2008

Я бы бросил помощника button_to и использовал бы правильную форму, передавая свойства продукта в действие add_to_cart.

<% form_for(@product) do |f| %>
<%= f.select :size, ['S', 'M', 'L', 'XL', 'XXL'] %>
# other properties...
<%= f.submit 'Add to Cart' %>
<% end %>
...