【问题标题】:Why is my @results Quiz object nil?为什么我的@results 测验对象为零?
【发布时间】:2015-02-13 17:50:11
【问题描述】:

我将以下内容传递给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 nil,当我在 Rails 要求的操作中设置它时?

Quiz 是在QuizzesController 中创建的:

def new
    @user = current_user
    @quiz = Quiz.create(user_id: current_user.id)
end

触发quizzes/new.html.erb 呈现部分测验。

有什么问题?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    @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

    【讨论】:

      【解决方案2】:

      在您的情况下,@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
      

      并从index.html.erb 中删除answer1, answer2, answer3....,它们真的没有任何意义。 此外,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 时,这才有效。很难说你的应用是什么。

      【讨论】:

      • 请问您是如何知道数组中的@results 的?
      • 因为您在一个类上调用.where,该类将返回满足您的条件的对象数组(user_id = current_user.id)。从这个人开始learnrubythehardway.org/book
      猜你喜欢
      • 2020-05-31
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 2020-11-05
      相关资源
      最近更新 更多