我有模型Project(:title字段),该模型具有has_many Todos(:text字段和project_id字段)。我想使用我的projects_controller索引页面创建表单,以创建此Todos。我试图这样做: 我的projects_contoller
class ProjectsController < ApplicationController
def index
@projects = Project.all
end
def update
end
def create
@todo = Todo.create(todo_params)
end
def delete
end
private
def todo_params
params.require(:todo).permit(:text, :project_id)
end
end
我的项目index.html.erb
<%= form_for @todo, url: {controller: "projects", action: "create"} do |r| %>
<%= r.text_field :text %>s
<%= r.text_field :project_id %>
<%= r.submit %>
<% end %>
但是当我运行我的应用程序时,出现错误:
First argument in form cannot contain nil or be empty
我说我有问题
<%= form_for @todo, url: {controller: "projects", action: "create"} do |r| %>
我应该怎么做才能使其成为可能?甚至可以在索引页面上执行创建吗?
答案 0 :(得分:1)
您需要在控制器索引方法中添加的所有内容是:
@todo = Todo.new
答案 1 :(得分:1)
projects_controller.rb
before_action :initialize_todo, only: [:index]
private
def initialize_todo
@todo = Todo.new
end
index.html.erb
<%= form_for @todo do |r| %>
表单将重定向到todos_controller内部的create方法
答案 2 :(得分:1)
第一个问题:
正如khaled所述-如果在项目索引控制器方法中创建新对象。
#projects_controller.rb
def index
@todo = Todo.new
@projects = Project.all
end
重定向到错误位置的问题都在表单代码中。
<%= form_for @todo, url: {controller: "projects", action: "create"} do |r| %>
这是告诉您的表单动作(如果您检查form元素,则可以在html中看到)-在项目控制器中是动作。
替换为:
@todo, url: {controller: "projects", action: "create"}
与
@todo
严格来说,如果对象在路由表中具有自己的路径,则不需要控制器和动作定义。然后确保从todo create的重定向返回到项目的索引,而不是todos的索引。
#todos_controller.rb
def create
@todo = Todo.new(todo_params)
respond_to do |format|
if @todo.save
format.html { redirect_to projects_path, notice: 'Todo was successfully created.' }
format.json { render :show, status: :created, location: @todo }
else
format.html { render :new }
format.json { render json: @todo.errors, status: :unprocessable_entity }
end
end
end
这意味着如果请求得到成功处理,它将重定向到项目索引。
如果是json请求,它将呈现show.json.jbuilder。
如果html请求失败,它将呈现app / views / todos / new.html.erb文件
这将允许向用户显示错误并更正POST的所有问题。