无法在rails中创建新对象

时间:2016-08-13 01:01:07

标签: ruby-on-rails

我正在尝试在rails中创建基本项目创建,但我在创建新项目时遇到问题。我想创建项目name,比如说Wash the dishes。这些是我的代码:

路线:

resources :items

上述ItemsController:

class ItemsController < ApplicationController
...
  def new
    @item = Item.new
  end

  def create
    @item = Item.new(item_params)

    if @item.save
      flash[:notice] = "Item was saved!"
      redirect_to @item
    else
      flash.now[:alert] = "ERROR. ERROR."
      render :new
    end
  end
...
  private

  def item_params
    params.require(:item).permit(:name, :list_id)
  end

end

项/ new.html.erb

<%= form_for :item do |f| %>

    <%= f.text_field :name %>

    <%= f.submit %>
<% end %>

最后,架构:

  create_table "items", force: :cascade do |t|
    t.string   "name"
    t.integer  "list_id"
    t.datetime "created_at",                 null: false
    t.datetime "updated_at",                 null: false
  ...

我有几个不同的错误代码,但这是我目前所处的错误代码(有时它会显示不同的错误代码,或者只是打印出来&#34; ERROR。错误。&#34;(警告我save失败时设置

Routing Error
No route matches [POST] "/items/new"

当我去rake路线时:

         POST  /items(.:format)                           items#create
new_item GET   /items/new(.:format)                      items#new

我按照SO post的建议来检查我的路线,这就是我所拥有的:

2.2.2 :019 > r = Rails.application.routes
 => #<ActionDispatch::Routing::RouteSet:0x007fff323c3230> 
2.2.2 :020 > r.recognize_path "/items/new"
 => {:controller=>"items", :action=>"new"} 

我也去了rails c,我可以手动创建新项目。 (i = Item.new(name:"Test 123"); i.save

我错过了什么?

2 个答案:

答案 0 :(得分:1)

问题在于您的表单。要了解错误,请执行以下操作:

  1. 使用rails s
  2. 启动rails服务器
  3. 转到http://localhost:3000/items/new
  4. 而不是填写表单字段,view源页面
  5. 检查表单标记。它将表单数据提交给/items/new。即,action属性设置为/items/new。那是为什么?
  6. 来自文档:

      

    当模型由字符串或符号表示时,如果未指定:url选项,则默认情况下表单将被发送回当前url(我们将在下面描述form_for的替代资源导向用法,其中不需要明确指定URL。

    <form action="/items/new" accept-charset="UTF-8" method="post">
    

    routes.rb中,没有匹配POST /items/new

    的路线

    因此,请将表单修改为

    <%= form_for :item, url: items_path do |f| %>
      <%= f.text_field :name %>
     <%= f.submit %>
    <% end %>
    

    这会生成一个表单标记,post将数据/items而非/items/new

    或者用

    替换您的表单
    <%= form_for @item do |f| %>
     <%= f.text_field :name %>
     <%= f.submit %>
    <% end %>
    

    现在,表单将提交给/items。使用第二个版本的优点是您可以干掉表单以创建新对象并将现有对象更新为单个视图(部分)。

    有关详情,请参阅http://guides.rubyonrails.org/form_helpers.html#binding-a-form-to-an-object

答案 1 :(得分:0)

在items / new.html.erb

中试试
<%= form_for @item do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>