2016-01-12 95 views
0

我試圖設置一個簡單的購物車。我希望能夠點擊的記錄「添加」,然後有添加到購物車該項目與記錄/線路Rails - 似乎無法將參數傳遞給方法

<% @documents.each do |document| %> 
    <td><%= link_to "add", add_to_cart_path(8), :method => :post %></td> 
<% end %> 

我把add_to_cart_path(8)作爲排除故障的ID。我真的希望這是add_to_cart(document.id)然而,無論哪種方式,當前doc ID參數沒有傳遞到創建新的項目記錄。

我的路線是

post '/add_to_cart/:doc_id' => 'carts#add_to_cart', :as => 'add_to_cart' 

的車控制器已

def add_to_cart 
    $current_doc_id = doc_id 
    current_cart.add_item(:doc_id) 
    redirect_to carts_path(current_cart.id) 
end 

我的車模型

def add_item(document_id) 
    @line_item = Item.create(:document_id => document_id, :cart_id => $cart_number) 
    if @line_item.save 
    # flash[:success] = "item added!" 
    else 
    # flash[:fail] = "!" 
    end 
end 

當我看項目表,正在創建的記錄,購物車ID已正確填充。但是,document_id字段爲'null'。

+5

您正在傳遞':doc_id'而不是實際的文檔ID。你應該通過'params'方法使用你的參數,例如'params [:doc_id]'。 –

+0

工作。該鏈接已成功傳遞當前文檔ID。 –

+0

您可以使用'better_errors' gem進行調試。 –

回答

0

我知道你有答案,但我想清理你的代碼有點...

#config/routes.rb 
resources :cart, only: [] do 
    collection do 
    post "add/:document_id", to: :create  #-> url.com/cart/add/:document_id 
    delete "remove/:document_id", to: :destroy #-> url.com/cart/remove/:document_id 
    end 
end 

#app/controllers/cart_controller.rb 
class CartController < ApplicationController 
    before_action :set_document 

    def create 
    current_cart.line_items << @document 
    redirect_to carts_path current_cart.id 
    end 

    def destroy 
    current_cart.line_items.delete @document 
    redirect_to carts_path current_cart.id 
    end 

    private 

    def set_document 
    @document = Document.find params[:document_id] 
    end 

end 

這將允許您使用:

<%= link_to "Add to Cart", carts_add_path(@document), method: :post %> 
<%= link_to "Remove from Cart", carts_remove_path(@document), method: :delete %> 

你有一個基本的antipattern因爲您在Cart模型中使用基於請求的邏輯。模型只能用於數據驅動的邏輯;需要保持你的控制器內要求所有的邏輯:

if @line_item.save 
    # flash[:success] = "item added!" 
    else 
    # flash[:fail] = "!" 
end 

...需要在您的控制器如果你依靠它形成的響應。


我們已經建立了一個車前(使用session model)。您可能會從我們使用的代碼中受益。這是給你的根本不同之處在於它使車在一個會話cookie,而不是在一個模型保存數據:

enter image description here

#config/routes.rb 
resources :cart do 
    collection do 
     post 'cart/add/:id', to: 'cart#add', as: :cart_add 
     delete 'cart/remove(/:id(/:all))', to: 'cart#delete', as: :cart_delete 
    end 
end 

#app/controllers/cart_controller.rb 
class CartController < ApplicationController 
    include ApplicationHelper 

    #Index 
    def index 
     @items = cart_session.cart_contents 
    end 

    #Add 
    def add 
     session[:cart] ||={} 
     products = session[:cart][:products] 

     #If exists, add new, else create new variable 
     if (products && products != {}) 
      session[:cart][:products] << params[:id] 
     else 
      session[:cart][:products] = Array(params[:id]) 
     end 

     #Handle the request 
     respond_to do |format| 
      format.json { render json: cart_session.build_json } 
      format.html { redirect_to cart_index_path } 
     end 
    end 

    #Delete 
    def delete 
     session[:cart] ||={} 
     products = session[:cart][:products] 
     id = params[:id] 
     all = params[:all] 

     #Is ID present? 
     unless id.blank? 
      unless all.blank? 
       products.delete(params['id']) 
      else 
       products.delete_at(products.index(id) || products.length) 
      end 
     else 
      products.delete 
     end 

     #Handle the request 
     respond_to do |format| 
      format.json { render json: cart_session.build_json } 
      format.html { redirect_to cart_index_path } 
     end 
    end 

end 

然後以顯示購物車:

#app/views/cart/index.html.erb 
<% @items.each do |item| %> 
    <%= item.name %> 
<% end %> 

如果不合適,我會刪除,我想它會給你一些觀點。