1

ユーザーに商品を表示するための簡単なテストを作成しています。私のスペックは次のようになります:

require 'spec_helper'

describe "Show Products" do
  it "Displays a user's products" do
    product = Factory(:product)
    visit products_path
    page.should have_content("ABC1")
  end
end

製品の私の工場は次のようになります。

FactoryGirl.define do
  factory :product do
    sequence(:identifier, 1000) {|n| "ABC#{n}" }
  end
end

私は簡単な見方をしています:

<table id="products">
  <thead>
<th>Product ID</th>
  </thead>
  <tbody>
    <% for product in @products %>
      <tr>
        <td><%= @product.identifier %></td>
      </tr>
    <% end %>
  </tbody>
</table>

私が得ているエラーは、@productsのようなものがないということです。まあ、そうだろう。そしてそれが私の質問です。私のファクトリは「product」として定義されており、その中にシーケンスがあるので、「product」の値を「products」という変数に入れるにはどうすればよいですか。

私は基本的に上記のFactoryGirl構文に混乱しています。その1つのラインで複数の製品を生成することができますが、工場名はモデルと一致する必要がありますか?

4

1 に答える 1

1

インスタンス変数@productsは、ProductsControllerのインデックスアクションで割り当てられている可能性があります。そうでない場合は、そこで定義する必要があります。

一般に、リクエストスペックで発生するのは、ファクトリを使用してデータベースに永続化されるオブジェクトを作成し、その後、コントローラーがそれらのレコードを取得して、ビューで使用できるようになるインスタンス変数に割り当てることです。インデックスをレンダリングしているように見えるので、コントローラーに次のようなものが表示されると思います。

class ProductsController < ApplicationController::Base
  def index
    @products = Product.all
  end
end

このインスタンス変数は、レンダリング時にビューで使用できるようになります。

また、ビューにタイプミスがあるようです。イテレータには次のものがあります。

for product in @products
  # do something with product
end

これにより、すべての製品が繰り返され、変数「product」がブロック内で使用可能になります。代わりに、ブロックで@productを使用していますが、これはタイプミスのようです。

于 2012-05-11T22:58:03.223 に答える