为什么我的@results测验对象为零?

时间:2014-12-15 15:23:15

标签: ruby-on-rails ruby

我将以下内容传递给results/index.html.erb视图:

 def create
        @results = Quiz.where(user_id: current_user.id)
            redirect_to results_path
    end

(我已将上述操作改为BACK以创建)。

然后,在我的results/index.html.erb视图中:

<div class="container">
      <!-- Example row of columns -->
      <div class="row">
        <h1>Results page</h1>
        <div class="col-md-12">
          <p>Eventually a user's results will appear here...</p>
          <p><%= @results %></p>
          <p><%= @results.inspect %></p>
          <p><%= current_user.quiz %></p>
             <h4>Quiz Answer</h4>
             <p><%= @results.answer1 %></p>
             <p><%= @results.answer2 %></p>
             <p><%= @results.answer3 %></p>
             <p><%= @results.answer4 %></p>
             <p><%= @results.answer5 %></p>
             <p><%= @results.answer6 %></p>
             <p><%= @results.answer7 %></p>
             <p><%= @results.answer8 %></p>
        </div>
      </div>

      <footer>
        <p><a class="btn btn-default" href="showmetheskills.html" role="button">next</a></p>
      </footer>
    </div> <!-- /container -->

(我知道在模型上设置编号属性不是'最佳实践';忽略该部分。)

我收到错误:

undefined method 'answer1' for nil:NilClass

为什么@results为零,当我在行动中设置它时Rails要求?

Quiz

中创建了QuizzesController
def new
    @user = current_user
    @quiz = Quiz.create(user_id: current_user.id)
end

哪个触发器quizzes/new.html.erb会使测验部分呈现。

有什么问题?

2 个答案:

答案 0 :(得分:0)

@results为零,因为您已完成重定向。渲染视图

def update
  @results = Quiz.where(user_id: current_user.id)
  render: 'results#index'
end

或者进行重定向并在那里获得结果,这是我的首选选项,但我不知道为什么您在不更新任何内容的情况下将其发送到更新操作。

def update
  redirect_to results_path
end

def ResultsController
  def index
    @results = Quiz.where(user_id: current_user.id)
  end
end

无论哪种方式,@results.answer1之类的东西都不起作用,因为你有一个活跃的记录关系。你需要循环

<% @results.each do |result| %>
  <%= result.answer1 %>
<% end %>

或抓住第一个结果

@results = Quiz.where(user_id: current_user.id).first

答案 1 :(得分:0)

在你的情况下,@results是一个数组,你在数组上调用了一些answer1, answer2, answer3...方法(我还没有定义)。

下一步:

您在更新操作中初始化@results,但希望它在resuzlts/index.html.erb中有效。

要在索引html中显示@results,您需要在index操作中加载此变量。

<强>更新

如果您希望index操作显示某些内容,请输入以下行:

@results = Quiz.where(user_id: current_user.id)

进入索引行动

def index
  # here
end

并从answer1, answer2, answer3....移除index.html.erb,它们真的毫无意义。 此外,index.html.erb应如下所示:

<div class="col-md-12">
  <p><%= current_user.quiz %></p>
  <h4>Quiz Answer</h4>

  <% @results.each do |result| %>
    <p><%= result.answer %></p>
  <% end %>
</div>

只有在为结果定义answer时才会有效。很难说你的应用程序是什么。