我正在尝试构建一个待办事项列表,但每当我尝试渲染' 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
答案 0 :(得分:0)
render
和redirect_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
可以正常呈现。