Rails Todo列表为什么我得到no方法错误

时间:2015-09-10 10:13:49

标签: ruby-on-rails ruby

我正在尝试构建一个待办事项列表,但每当我尝试渲染' index'但是当我使用渲染' new'它在控制器中起作用为什么会发生这种情况可以帮助我。

查看index.html.erb

<style = "text/css">
  div{
    width: 50%;
    height: 10%;
    background-color: #FFCC00;
    border-radius: 10px;
  }
  h2{
    margin-bottom: 20px;
    margin-left: 10px;
  }
  h4{
    float: right;
    margin: 0 0 0 0;
    text-align: top;
  }
  #form{
    background-color: #eee;
  }
</style>

<% @lists.each do |list| %>
  <div>
      <h2><%= list.name %> <%= link_to 'Trash',list,method: :delete %></h2>
  </div>


<% end %>

<div id ="form">
  <%= render 'form' %>
</div>

<br>

<%= link_to 'Add a new task', new_list_path %>

控制器listscontroller.rb

class ListsController < ApplicationController
  before_action :set_list, only: [:show, :edit, :update, :destroy]


  def index
    @lists = List.all
  end


  def show
  end


  def edit
  end


  def create
    @list = List.new(list_params)

    if @list.save
      redirect_to root_url
    else 
      render 'index'
    end
  end

  def update
    respond_to do |format|
      if @list.update(list_params)
        format.html { redirect_to @list, notice: 'List was successfully       updated.' }
        format.json { render :show, status: :ok, location: @list }
      else
        format.html { render :edit }
        format.json { render json: @list.errors, status: :unprocessable_entity }
      end
    end
  end


  def destroy
    @list.destroy
    respond_to do |format|
      format.html { redirect_to root_url, notice: 'List was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private

  def set_list
    @list = List.find(params[:id])
  end

  def list_params
    params.require(:list).permit(:name)
  end
end

1 个答案:

答案 0 :(得分:0)

renderredirect_to之间存在重要差异。在您的create方法中,如果无法保存新的List,则您需要呈现index.html.erb模板。这不会在您的控制器中运行index方法,它只是要求Rails呈现模板。模板需要定义@lists,而不是,因为您没有通过index操作。

您想要的典型模式实际上是render 'new'。这将再次呈现表单,以便您的用户可以更正List属性中的任何错误并尝试重新提交。您还没有向我们展示您的new代码,但通常的代码如下所示:

# app/controllers/lists_controller.rb

def new
  @list = List.new
end
# app/views/lists/new.html.erb

<% form_for @list do %>
  The creation form...
<% end %>

当用户刚刚进入时,控制器中的new操作会为要使用的表单设置@list = List.new。您也可以在此处设置您喜欢的任何默认值。如果创建失败并且您render 'new',则您的create操作也已为@list分配了用户输入的值,因此再次呈现new.html.erb将起作用。

如果这不是您想要的,并且您确实想要将用户带到列表索引,请使用redirect_to lists_path。这会将用户的浏览器发送回index操作,@lists将被分配,index.html.erb可以正常呈现。