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 方法上执行此操作,我通过了一个 after_filter 到 CartsController。

在 carts#new 中,我有两个表格,一个列出产品,每个都有一个“添加到购物车”链接,另一个表格列出给定购物车的现有订单项。

<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