0

アプリケーションショッピングカートの部分(views / cart / _cart.html.erb )を作成しました。私はviews/layouts/application.html.erbファイルでのみレンダリングしています。しかし、実行すると、 views / cart / _cart.index.erb以外のすべてのページでNoMethodErrorが発生します。これは、レンダリングされているパーシャルと同じコントローラーを共有しているためと思われます。

私はどこでも答えを探していましたが、パーシャルをレンダリングするときに変数を渡す方法と関係があると信じています。誰かが見てくれたら本当にありがたいですか?

すべてのコードはここにあります:https ://github.com/rossmc/topsnowboards

パーシャル(views / cart / _cart.html.erb)のコードが始まります:

<% @cart = cart%>

<h1>Your Cart</h1>

<% if @cart.empty? %>
    <p>There is nothing in your shopping Cart</p>
<% end %>

<% total = 0 %>

<!-- More code displaying the rest of the cart omitted for brevity 

パーシャルは、views / layouts/application.html.erbに次のようにレンダリングされます。

<%= render :partial => "/cart/cart", :locals => { :cart => @cart } 

実行すると、Railsが私に返すエラーメッセージは次のとおりです。

NoMethodError in Site#home

Showing Server Side/PROJ-Server Side/app/views/cart/_cart.html.erb where line #5 raised:

undefined method `empty?' for nil:NilClass

Extracted source (around line #5):

2: 
3: <h1>Your Cart</h1>
4: 
5: <% if @cart.empty? %>
6:  <p>There is nothing in your shopping Cart</p>
7: <% end %>
8: 
4

1 に答える 1

1

ここで言及したコードには少し冗長性があります。@cartはインスタンス変数であり、ローカルとして渡す必要なしにパーシャルで使用できる必要があります(もちろん、最初に定義した場所によって異なります)。したがって、カートパーシャルの最初の行は必要ありません。カートはアプリケーションレイアウトで部分的にレンダリングされるため、このレイアウトを使用するすべてのページ(通常はサイト全体)でレンダリングされます。

必要なのは@cart、サイトのすべてのページ(つまり、すべてのコントローラー)で変数を使用できるようにすることです。すべてのコントローラーはあなたから継承するので、そこでApplicationController定義するのは理にかなっています@cart。を定義するbefore_filterにを追加するだけです。コードをすばやくスキミングすると、これで問題が解決するはずです。ApplicationController@cart

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :the_cart

  private

  def the_cart
    @cart = session[:cart] || {}
  end

  # the rest of the code ...
end
于 2012-12-02T08:08:47.803 に答える