私は次のアプリケーションを開発しています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 コマンドがわかりません。
これが長すぎることは承知していますが、私の主張をしなければなりませんでした。
ありがとう :)