2008-11-09 2 views
3

Я только что подобрал Agile Web Development с Rails 3rd Ed., И я перехожу к главам приложения Depot, и у меня есть вопрос о вариантах продукта/предмета -Вопрос о создании корзины для покупок/Rails

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

Скажем, я продаю футболки, и они бывают разных размеров. Я не чувствую, что это то, что действительно нуждается в модели, созданной для обработки размеров, поэтому я подумал, что могу просто добавить ее в качестве окна выбора в 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"> 

ответ

0

Я уронить 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 %> 
+0

Это шаг в правильном направлении, но только помогает отображать ** размер ** в моей тележке. Мне нужно добавить ** размер ** к моему объекту тележки, чтобы он фактически хранился вместе с товаром в моей тележке. Еще раз спасибо за любую помощь, я работаю над этим все выходные, но я, очевидно, не программист. --Mark – 2008-11-10 00:58:17

0

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

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

1

Я не уверен, почему вы не будете хранить размер, если только вы не имеете в виду, что вы храните размер как часть 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

Я согласен. Я бы добавил размер к модели cart_item. – Owen 2008-11-10 16:42:32

4

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

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) 

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

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

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

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

4, в дополнение к модели cart_item:

attr_reader :product, :quantity, :productsize 

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

читать в productsize и инициализировать Cart Item.

5, добавляют к моему add_to_cart:

Size: <%=h item.productsize %> 

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

Все. Если есть более простой способ DRYER, я все уши (глаза?).

Смежные вопросы