0

私のアプリの背景。1つのクイズと1つのユーザーに属するクイズを持つユーザーがいます。ユーザーが受けたクイズを一覧表示しようとしていますが、エラーが発生します。

Users#indexのNoMethodError

/Users/Daniel/Documents/cis196/CollegeConnection/app/views/users/index.html.erbを表示しています。ここで、行#24が発生しています。

nil:NilClassの未定義メソッド `userName'抽出されたソース(24行目あたり):

<% @user.each do |u| %>
  <tr>
    <td><h6><%= u.quiz.userName%></h6></td>
    <td><h6><%= u.quiz.q1 %></h6></td>
    <td><% for q in u.quiz.q2 %>
      <% if q != nil %>

Rails.root:/ Users / Daniel / Documents / cis196 / CollegeConnection

アプリケーショントレース| フレームワークトレース| フルトレースapp/views / users / index.html.erb:24:in block in _app_views_users_index_html_erb__3921348574137420689_70261694365660' app/views/users/index.html.erb:22:in_app_views_users_index_html_erb__3921348574137420689_70261694365660'app / controllers / users_controller.rb:25:in `index'

ここにいくつかの関連するコードがあります。

class User < ActiveRecord::Base

has_one :quiz, :class_name => 'Quiz'

attr_accessible :name, :email, :password, :password_confirmation, :position, :remember_me
validates :name, :presence => true
validates_length_of :name, :maximum=>30
validates :name, :format => { :with => /\A[a-zA-Z]+\z/,
:message => "Only letters allowed" }
validates_presence_of :position
validates :email, :presence => true
validates :email, :uniqueness => true

scope :college,    where(position: 'College')
scope :highschool, where(position: 'High School')

end


class Quiz < ActiveRecord::Base
belongs_to :user

validates :q1, :presence => true
validates :q2, :presence => true
validates :q3, :presence => true
serialize :q2
has_many :activities



 end

def create
@quiz = current_user.quizzes.build(params[:quiz])
# @quiz = Quiz.new(params[:quiz])
@quiz.userName=current_user.name
@activities = Activity.all

respond_to do |format|
  if @quiz.save
    format.html { redirect_to @quiz, notice: 'Thank You for Taking the Quiz!.' }
    format.json { render json: @quiz, status: :created, location: @quiz }
  else
    format.html { render action: "new" }
    format.json { render json: @quiz.errors, status: :unprocessable_entity }
  end
end
end

<% @user.each do |u| %>
<tr>
  <td><h6><%= u.quiz.userName%></h6></td>
  <td><h6><%= u.quiz.q1 %></h6></td>
  <td><% for q in u.quiz.q2 %>
  <% if q != nil %>
    <h6><%= q  %></h6>
  <% end %>
<% end %>
<td><h6><%= u.quiz.q3 %></h6></td>
<td>X</td>
</tr>
<% end %>

これはエラーのあるビューです。どんな助けでも素晴らしいでしょう!

4

3 に答える 3

1

ビューからインスタンス変数@userを呼び出していますが、コントローラーのどこにもインスタンス化していないため、nilです(存在しません)。

ビューファイルを呼び出すコントローラーでは、次のように変数をインスタンス化する必要があります。

# assuming you've already did something like
# @quiz = Quiz.find(params[:id]
# in order to retrieve the quiz
@user = @quiz.user

これにより、@userがビューで使用可能になります。詳細については、ActiveRecordアソシエーションガイドを参照してください:http://guides.rubyonrails.org/association_basics.html

于 2012-05-03T02:02:25.243 に答える
0

@userをトラバースしていることに気付きました。つまり、@ userは配列オブジェクト(おそらくユーザーの配列)です。

@userがコントローラーアクションまたはビューで正しく初期化されているかどうかを確認する必要があります。この場合、@ userがusers_controller、アクション「index」に設定されているかどうかを確認してください。

また、ユーザーの配列であるため、@userではなく@usersを使用してください。

于 2012-05-03T03:39:29.853 に答える
0

24行目は次の行だと思います。

<td><h6><%= u.quiz.userName%></h6></td>

エラーは「nil」に「.userName」メソッドがないことを示しているため、そのメソッドを呼び出そうとしているのはnilである必要があります。したがって、ユーザーの反復では、そのうちの1人に「.quiz」がない可能性があります。

ruby-debugを使用する場合は、その行にブレークポイントを設定してすべての値を検査できます(または、「putsu.quiz.inspect」を使用してコンソールにダンプします。

于 2012-05-03T07:37:11.207 に答える