0

我的应用程序的一点背景。我的用户有 1 个测验和一个属于用户的测验。我正在尝试列出用户参加的测验,但出现错误。

用户中的 NoMethodError#index

显示 /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,但您没有在控制器中的任何地方实例化它,因此它为零(不存在)。

在调用视图文件的控制器中,您必须像这样实例化变量:

# 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

我假设第 24 行是以下行:

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

由于错误告诉您“nil”没有“.userName”方法,因此试图调用该方法的东西必须是 nil。因此,在您的用户迭代中,其中一个很可能没有“.quiz”。

如果您使用 ruby​​-debug,您可以在该行上指定一个断点并检查所有值(或者只使用“puts u.quiz.inspect”将其转储到控制台。

于 2012-05-03T07:37:11.207 回答
0

我注意到您正在遍历@user,这意味着@user 是一个数组对象(可能是一个用户数组)。

您必须检查 @user 是否在控制器操作或视图中正确初始化。在这种情况下,检查是否在 users_controller 中设置了 @user,操作“index”。

此外,由于它是一组用户,请使用@users 而不是@user。

于 2012-05-03T03:39:29.853 回答