1

私は次のアプリケーションを開発していますhttp://secure-cove-9193.herokuapp.com/

Github: https://github.com/gatosaurio/show_action_broken

ここに私のモデルがあります:

class Customer < ActiveRecord::Base
  attr_accessible :name, :street
  has_many :carts, :dependent => :destroy
  has_many :line_items
end

class Product < ActiveRecord::Base
  attr_accessible :name, :price
end

class Cart < ActiveRecord::Base
  belongs_to :customer
  has_many :line_items, :dependent => :destroy
  attr_accessible :purchased_at
end

class LineItem < ActiveRecord::Base
  attr_accessible :cart, :cart_id, :product, :product_id, :quantity, :unit_price
  belongs_to :cart
  belongs_to :product

  def full_price
    unit_price * quantity
  end
end

次のように、ネストされたリソースも使用しています。

resources :products

resources :customers do
  resources :carts
  resources :line_items
end 

これが私が ApplicationController に持っているものです

class ApplicationController < ActionController::Base
  protect_from_forgery
  helper_method [:current_cart, :new_session]

  protected

  def current_cart
    session[:cart_id] ||= Cart.create!.id
    @current_cart ||= Cart.find(session[:cart_id])
  end

  def new_session
    if action_name == 'new' 
      @current_cart = nil
    else
      session[:cart_id] = nil
      current_cart = @current_cart
    end
  end
end

そこで、session[:cart_id] オブジェクトを作成または検索して current_cart メソッドに保存しますが、新しい Cart オブジェクトを作成する必要があるたびに、そのセッションをリセットする必要があります。これは new_session メソッドで行います。 CartsController への after_filter。

carts#new には 2 つのテーブルがあります。1 つは製品を一覧表示し、それぞれに「カートに追加」リンクがあり、もう 1 つは特定のカートの既存の品目を一覧表示します。

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <% @products.each do |product| %>
      <tr>
        <td><%= link_to product.name, product_path(product) %></td>
        <td><%= form_tag(customer_line_items_path, :method => "post") do %>
          <%= hidden_field_tag(:product_id, product.id) %>
          <%= submit_tag("Add to Cart") %>
          <% end %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<table>
  <tr>
    <th>Product</th>
    <th>Qty</th>
    <th>Unit Price</th>
    <th>Full Price</th>
 </tr>
<% @current_cart.line_items.each do |line_item| %>
<tr>
  <td><%= line_item.product.name %></td>
  <td class="qty"><%= line_item.quantity %></td>
  <td class="price"><%= number_to_currency(line_item.unit_price) %></td>
  <td class="price"><%= number_to_currency(line_item.full_price) %></td>

    </tr>
    <%= @current_cart.line_items.count %>

  <% end %>

</table> 

<%= form_tag(customer_carts_path, :method => "post") do %>
  <%= hidden_field_tag(:customer_id) %>
  <%= submit_tag("Create Cart") %>
<% end %>

これまでのところすべて問題なく動作していますが、私の質問は次のとおりです。どのインスタンス変数を carts#show に渡す必要がありますか? つまり、もう current_cartではありません。カートの顧客の名前を表示できます

def show
  @customer = Customer.find(params[:customer_id])
end

そしてそれを次のように印刷します:

<%= @customer.name.capitalize %>

しかし、特定の顧客のカートに関連付けられたすべての項目を取得する Active Record コマンドがわかりません。

これが長すぎることは承知していますが、私の主張をしなければなりませんでした。

ありがとう :)

4

0 に答える 0