2012-06-05 3 views
1

знакомства Update в 1 & 2 ниже для решенияДобавление продуктов в корзину

Я следовал учебник по созданию корзины из книги «Веб-разработка Agile с Rails» .. Они имеют главы Я следовал здесь: http://media.pragprog.com/titles/rails4/cart.pdf

в книге, которую они вам создать Line_Item, которые получают передаваемый в телегу и хранящийся в сессии с помощью этой линии <% = button_to «Добавить в корзину», line_items_path (product_id : product)%> Это в моем случае, очевидно, будет изменено на <% = button_to «», line_items_path (gear_id: передача), идентификатор: «rent_it»%>

Если я хочу, чтобы изменить это, так что это форма, которая также принимает другие параметры, как бы я это сделать?

Ниже приведен мой код, который я использовал и попытался выполнить, но пока безуспешно. С приведенным ниже кодом я получаю и ошибку, которая не может найти механизм без «id». Я новичок в рельсах и программировании в целом, поэтому я ценю помощь.

UPDATE 1 (Я обновил мой взгляд ниже, а)

теперь я могу видеть из моих журналов сервера, что я проходящий идентификатор шестерни в форме. Это то, что я изначально пытался сделать.

Processing by LineItemsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"0QnJShABOV+avPx0AJHxuMmskfwtwFlkpMa6cBhTU3s=", "line_item"=>{"rentstart"=>"", "rentend"=>"", "gear_id"=>"13"}, "commit"=>""} 
    Cart Load (0.4ms) SELECT `carts`.* FROM `carts` WHERE `carts`.`id` = 18 LIMIT 1 
Completed 500 Internal Server Error in 2ms 

ActiveRecord::RecordNotFound (Couldn't find Gear without an ID): 
    app/controllers/line_items_controller.rb:44:in `create' 

Я все еще получаю сообщение об ошибке Не удалось найти устройство без идентификатора. Какие 2 строки ниже:

gear = Gear.find(params[:gear_id]) 
    @line_item = @cart.add_gear(gear.id) 

Что я упускаю? Контроллер

Line Item в

def create 
    @cart = current_cart 
    gear = Gear.find(params[:gear_id]) 
    @line_item = @cart.add_gear(gear.id) 

    respond_to do |format| 
     if @line_item.save 
     format.html { redirect_to @line_item.cart } 
     format.json { render json: @line_item, status: :created, location: @line_item } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @line_item.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

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

class Cart < ActiveRecord::Base 
    has_many :line_items, dependent: :destroy 

    def add_gear(gear_id) 
    current_item = line_items.find_by_gear_id(gear_id) 
    if current_item 
     current_item.quantity += 1 
    else 
     current_item = line_items.build(params[:line_item]) 
    end 
    current_item 
    end 

    def total_price 
    line_items.to_a.sum { |item| item.total_price } 
    end 

end 

Вид Гир Показать Страница

<div class="gearside_date_main"> 
     <h3>Rental Date</h3> 
     <script> 
     $(function() { 
      var dates = $("#rentstart, #rentend").datepicker({ 
       defaultDate: "+1w", 
       changeMonth: true, 
       numberOfMonths: 1, 
       onSelect: function(selectedDate) { 
        var option = this.id == "rentstart" ? "minDate" : "maxDate", 
         instance = $(this).data("datepicker"), 
         date = $.datepicker.parseDate(
          instance.settings.dateFormat || 
          $.datepicker._defaults.dateFormat, 
          selectedDate, instance.settings); 
        dates.not(this).datepicker("option", option, date); 
       } 
      }); 
     }); 
     </script> 


    <%= form_for LineItem.new do |f| %> 
     <%= f.text_field :rentstart, id: 'rentstart' %> 
     <%= f.text_field :rentend, id: 'rentend' %> 
     <%= f.hidden_field :gear_id, :value => @gear.id %> 
     <%= f.submit "", id: 'rent_it' %> 
    <% end %> 
     <% end %> 
    </div> 

ОБНОВЛЕНИЕ 2

Я, наконец, получил его работу после комментариев Мурифокса. Я не совсем понял, как синтаксис структурирован при передаче хэша. Поэтому после долгих проб и ошибок он работает. Я включил мой обновленный код ниже, чтобы увидеть изменения, которые я сделал. Я знаю, когда вижу ответы, я всегда искал изменения. Надеюсь, это поможет кому-то еще ...

The View (Gear Show Page

<%= form_for LineItem.new do |f| %> 
    <%= f.text_field :rentstart, id: 'rentstart' %> 
<%= f.text_field :rentend, id: 'rentend' %> 
<%= f.hidden_field :gear_id, :value => @gear.id %> 
    <%= f.submit "", id: 'rent_it' %> 
<% end %> 

Контроллер (Create Action)

def create 
    @cart = current_cart 
    gear = Gear.find(params[:line_item][:gear_id]) 
    lineitem = params[:line_item] 
    @line_item = @cart.add_gear(lineitem, gear.id) 

    respond_to do |format| 
     if @line_item.save 
     format.html { redirect_to @line_item.cart } 
     format.json { render json: @line_item, status: :created, location: @line_item } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @line_item.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Тележка Модель

def add_gear(lineitem, gear_id) 
    current_item = line_items.find_by_gear_id(gear_id) 
    if current_item 
     current_item.quantity += 1 
    else 
     current_item = line_items.build(lineitem) 
    end 
    current_item 
    end 

ответ

1

Попробуйте использовать

gear = Gear.find(params[:line_item][:gear_id]) 
+0

Я получаю следующее сообщение об ошибке, если я использую эту строку: «NameError в LineItemsController # создать неопределенную локальную переменную или метод' параметры»для # <Корзина: 0x007ff8d67088f8>» – DaveG

+0

О, я предположил, этот код находился в контроллере. Чтобы получить доступ к хэшу params в вашей модели корзины, вы должны передать его с помощью параметров метода. – MurifoX

+0

Ну ... код в моем контроллере. Ошибка, которую я вам показываю, - это представление, после того как я отправлю форму. Все еще немного запутано. Маска обригадо пара суа респоста. Эсперо que tudo esta bom la в Бразилии. – DaveG

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