1

セッションオブジェクトに存在する広告申込情報を使用してショッピングカートを作成しました。カートが存在する場合はショッピングカートの表示ページにリンクする方法がわかりません。存在しない場合は「カートが空です」ページにリンクするだけです。私は何が欠けていますか?私のコードは以下の通りです:

  • カートhas_manyline_items、およびlineitemsはカートに属しています

リンク を表示、ここに何を配置すればよいか、どこに定義するかがわかりませんでした。たとえば、「if current_cart.empty?cart」、「if @ cart.line_items.empty?current_cart」などです。

        <% if current_cart.line_items.empty?%>
        <%= link_to "cart", cart_path, :class =>'headertab' %>&nbsp;
    <% else %>
        <%= link_to "cart", cart_path(current_cart), :class =>'headertab' %>&nbsp;
    <% end %>

これにより、次のエラーが発生します。

Showing /Users/dave/rails_projects/EquiptMe/app/views/layouts/_headerexterior.html.erb where line #20 raised:

undefined local variable or method `current_cart' for #<#<Class:0x007fae841cc8e0>:0x007fae83339698>
Extracted source (around line #20):

17:         <li><%= link_to "browse gear", '/gear', :class =>'headertab' %></li>
18:         <li><%= link_to "join", '/signup', :class =>'headertab' %></li>
19:         <li>
20:         <% if current_cart.line_items.empty?%>
21:             <%= link_to "cart", cart_path, :class =>'headertab' %>&nbsp;
22:         <% else %>
23:             <%= link_to "cart", cart_path(current_cart), :class =>'headertab' %>&nbsp;

ルート

Outdoor::Application.routes.draw do
  resources :line_items

  resources :carts
.....

アプリケーションコントローラー

class ApplicationController < ActionController::Base
  protect_from_forgery

  private

  def current_cart
    Cart.find(session[:cart_id])
    rescue ActiveRecord::RecordNotFound
      cart = Cart.create
      session[:cart_id] = cart.id
      cart
  end
end

カートコントローラー「表示」、「破棄」、「作成」

 def show
    begin
    @cart = Cart.find(params[:id])
    rescue ActiveRecord::RecordNotFound
      logger.error "Attempt to access invalid cart #{params[:id]}"
      redirect_to '/gear', notice: 'Invalid cart'
    else
      respond_to do |format|
        format.html # show.html.erb
        format.json { render json: @cart }
      end
   end

  def destroy
    @cart = current_cart
    @cart.destroy
    session[:cart_id] = nil

    respond_to do |format|
      format.html { redirect_to carts_url, notice: 'Your cart is currently empty' }
      format.json { head :no_content }
    end
end

  def create
    @cart = Cart.new(params[:cart])

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

ラインアイテムコントローラー「作成」

 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
  end

助けてくれてありがとう!

4

1 に答える 1

4

コードから、常に作成されたCartオブジェクトがあります。あなたのcurrent_cartメソッドは、常にオブジェクトを返すnewか、以前に作成したCartオブジェクトなので、にリンクする必要がありますcart_path(current_cart)

  <%= link_to "my cart", cart_path(current_cart), :class =>'headertab' %>

別のケースでは、カートが空かどうかを確認したい場合は? この場合、使用する必要がありますcurrent_cart.line_items.empty?

編集済み

ビューとコントローラーでアクセスするには、ApplicationController に宣言をcurrent_cart追加します。helper_method :current_cart

コードの更新:

class ApplicationController < ActionController::Base
  protect_from_forgery

  private

  def current_cart
    Cart.find(session[:cart_id])
    rescue ActiveRecord::RecordNotFound
      cart = Cart.create
      session[:cart_id] = cart.id
      cart
  end
  helper_method :current_cart
end
于 2012-05-28T05:08:11.287 に答える