我的应用程序的一些背景知识。我的用户有1个测验和一个属于用户的测验。我试图列出用户已经采取的测验,但是我收到了错误。
用户#index
中的NoMethodError显示/Users/Daniel/Documents/cis196/CollegeConnection/app/views/users/index.html.erb第24行:
nil的未定义方法`userName':NilClass 提取的来源(第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:在`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 %>
这是带有错误的视图。任何帮助都会很棒!
答案 0 :(得分: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
答案 1 :(得分:0)
我注意到你正在遍历@user,这意味着@user是一个数组对象(可能是一组用户)。
您必须检查@user是否在控制器操作或视图中正确初始化。在这种情况下,检查@user是否在users_controller中设置,操作“index”。
此外,由于它是一组用户,请使用@users而不是@user。
答案 2 :(得分:0)
我假设第24行是行:
<td><h6><%= u.quiz.userName%></h6></td>
由于错误告诉你“nil”没有“.userName”方法,所以尝试调用该方法的东西必须是nil。因此,在您的用户迭代中,其中一个很可能没有“.quiz”。
如果你使用ruby-debug,你可以在该行上指向断点,检查所有值(或者只使用“puts u.quiz.inspect”将其转储到控制台。