2012-06-05 288 views
1

查看更新的1以下& 2解決方案將產品添加到購物車

我已經從書「敏捷Web開發使用Rails」創建購物車以下教程。他們有一章我一直在以下位置:http://media.pragprog.com/titles/rails4/cart.pdf

在這本書中,他們讓你創建一個獲得真實傳遞到車,並通過這條線<%= button_to「添加到購物車」,line_items_path存儲在會話LINE_ITEM(產品:product)%>這在我的情況下顯然會更改爲<%= button_to',line_items_path(gear_id:齒輪),ID: 'rent_it' %>

如果我想改變這種做法,它也接受其他參數我會怎麼做這一種形式?

下面是我的代碼,我已經使用並嘗試完成此操作,但目前爲止尚未成功。 用下面的代碼,我得到和錯誤,不能找到沒有'身份證'的裝備。我是新來的鐵路和編程一般,所以我感謝幫助。

更新1(我更新下面還有我的視圖)

現在我可以從我傳遞齒輪的ID形式我的服務器日誌中看到。這是我最初試圖做的。

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' 

我仍然收到錯誤找不到沒有ID的齒輪。下面是兩行:

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

我在想什麼?

行項目的控制器

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> 

UPDATE 2

在Murifox的評論後,我終於得到了它的工作。我沒有完全理解傳遞散列時語法的結構。所以經過多次試驗和錯誤後,它正在工作。我在下面列出了我的更新代碼,以查看我所做的更改。我知道,當我看到答案時,我總是在尋找變化。我希望這可以幫助別人....

的視圖(齒輪顯示頁面

<%= 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 %> 

的控制器(創建操作)

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#創建 未定義局部變量或方法'PARAMS」爲#<購物車:0x007ff8d67088f8>」 – DaveG

+0

噢,我假定這段代碼在控制器中。要在您的購物車模型中訪問參數散列,您必須通過方法參數傳遞它。 – MurifoX

+0

呃...代碼在我的控制器中。一旦我提交表單,我向你展示的錯誤就是來自視圖。仍然有點困惑。馬上obrigado para sua resposta。 Espero que tudo esta bom la in Brasil。 – DaveG

相關問題