当我渲染这个视图时,为什么我的实例变量持有`nil`?

时间:2014-03-16 23:55:53

标签: ruby-on-rails

当我直接查看我的index视图时,它的行为符合预期。

但是,当我尝试在创建记录后立即呈现index视图时,我的变量变为nil,我看到此消息:

enter image description here 任何有关为什么会发生这种情况的见解都会b

这是我的'TodoController`:

class TodosController < ApplicationController
    def index
        @todo = Todo.new
        @todos = Todo.where(done:false,user:current_user.email)
        @todones = Todo.where(done:true,user:current_user.email)
    end

 def create
     @todo = Todo.new(todo_params)
     respond_to do |format|
         if @todo.save
             format.js
             format.html {render "index"} #WHERE I RENDER INDEX PROMPTING THE ERROR!
         else
             render "new"
         end
     end
 end
 end

index.html.erb视图中,我有这个:

<h3> TO DO </h3>
<ul class="todos">
        <% @todos.each do |t| %>
            <%= render partial: "todo", object:t  %>
        <% end %>
</ul>

部分_todo.html.erb

<li>
    <strong><%= todo.name %></strong>
    <small><%= link_to "Mark as done", todo_path(todo.id), :method => :put %></small>
</li>

现在当我尝试插入

1 个答案:

答案 0 :(得分:2)

@todosnil,因为它是在视图中创建的,而不是在控制器的create操作中填充。

快速解决方法是在视图中添加条件:

<% unless @todos.nil? %>
  <ul class="todos">
        <% @todos.each do |t| %>
            <%= render partial: "todo", object:t  %>
        <% end %>
  </ul>
<% end %>

或者,您可以在@todos中填充create,但我怀疑这是意图。

如果您想在create操作后将用户发送到索引页面,我建议您使用redirect_to index_url通过新的HTTP请求执行此操作,而不是使用create呈现索引视图{{1}}行动。{{1}}

这应该避免需要&#39;&lt;%除非@ todos.nil? %&gt;在您的视图中的`语句。