1

現在使用中のシステムに取り組んでいますが、あまり使用されていない機能のエラーが発生しました。

NoMethodError in Offer_receipts#index

Showing /Users....../app/views/offer_receipts/index.html.erb where   line #8 raised:

undefined method `each' for nil:NilClass
Extracted source (around line #8):

5:     <th>Patron</th>
6:     <th>One Time Offer</th>
7:   </tr>
8:   <% for offer_receipt in @offer_receipts %>
9:     <tr>
10:       <td><p> popld</p></td>
11:       <td><%= offer_receipt.patron_id %></td>

このエラーは、この部分的なレンダリング ページが現在表示されているときに発生します。

<h2>Offers</h2>
<div id="offers">
<% if @offers.count > 0 %>
 < % @offers.each do |o| %>  
    <%= show_one_time_offer(o, @patron) %>
  <% end %>

<% else %>
  <strong>There are no offers currently available</strong>


<% end %>
</div>

一度限りのオファーをクリックすると、このページが読み込まれ、これがエラーが発生したページです。

index.html.erb

<% title "Offer Receipts" %>

<table>
  <tr>
    <th>Patron</th>
    <th>One Time Offer</th>
  </tr>
  <% for offer_receipt in @offer_receipts %>
    <tr>
      <td><%= offer_receipt.patron_id %></td>
      <td><%= offer_receipt.one_time_offer_id %></td>
      <td><%= link_to "Show", offer_receipt %></td>
      <td><%= link_to "Edit", edit_offer_receipt_path(offer_receipt) %></td>
      <td><%= link_to "Destroy", offer_receipt, :confirm => 'Are you sure?', :method => :delete %></td>
    </tr>
  <% end %>
</table>

<p><%= link_to "New Offer Receipt", new_offer_receipt_path %></p>

ここに、One Time Offer 領収書の方法と範囲を定義する 2 つのファイルがあります。

offer_receipt.rb

class OfferReceipt < ActiveRecord::Base
  belongs_to :patron
  belongs_to :one_time_offer
  validates :patron, :presence=>true
  validates :one_time_offer, :presence=>true
  require 'offer_receipt_validator.rb'
  validates_with OfferReceiptValidator


end

offer_receipts_controller.rb

class OfferReceiptsController < ApplicationController
  def create
    begin
      @patron = Patron.find(params[:patron])
    rescue ActiveRecord::RecordNotFound
      flash[:error] = "You must provide a patron for an offer receipt"
      redirect_to root_url
      return
    end
    @offer_receipt = OfferReceipt.new(:patron_id=>params[:patron], :one_time_offer_id=>params[:one_time_offer])
    if @offer_receipt.save && @patron
      redirect_to @patron, :notice => "Recorded offer receipt"
    else
      flash[:error] = "There was a problem saving your offer receipt"
      redirect_to @patron
    end
  end
end

ループごとにまったく同じ他のものをリストするための他の index.html.erb ファイルがあり、それらは正常に機能しています。データベースも確認しましたが、2000 行を超えているため、問題になることはありません。

4

1 に答える 1

0

インスタンス変数がコントローラー アクション@offer_receiptに設定されていません。#index

#indexアクションを追加する必要があります。このようなものが動作するはずです:

class OfferReceiptsController < ApplicationController 
  def index
    @offer_receipts = OfferReceipt.all
  end
end

#indexアクションにロジックを追加することもできます。たとえば、インスタンス変数を にスコープすることができますcurrent_user

@offer_receipts = OfferReceipt.where(:user_id => current_user.id)
于 2014-11-20T03:07:37.850 に答える