是否可以在rails5的“索引”页面上创建创建表单?

时间:2018-07-14 16:01:08

标签: ruby-on-rails ruby activerecord

我有模型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| %>

我应该怎么做才能使其成为可能?甚至可以在索引页面上执行创建吗?

3 个答案:

答案 0 :(得分:1)

您需要在控制器索引方法中添加的所有内容是:

@todo = Todo.new

答案 1 :(得分:1)

  1. projects_controller.rb

before_action :initialize_todo, only: [:index]

private def initialize_todo @todo = Todo.new end

  1. 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的所有问题。