2016-08-13 2 views
0

Я пытаюсь создать базовое создание элемента в рельсах, но у меня возникли проблемы с созданием нового элемента. Я хочу создать элемент 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 
    ... 

У меня есть несколько разных кодов ошибок, но это тот, на котором я сейчас застрял (в других случаях он показывал другой код ошибки или просто печатал «ERROR. . ОШИБКА»(оповещать, что установка I, когда save терпит неудачу)

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

Когда я разгребать маршруты:

  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)

Что я пропустил?

ответ

1

Проблема с вашей формой. Чтобы понять, что это неправильно, сделайте следующее:

  1. Запуск сервера рельсов с помощью rails s
  2. Перейти к http://localhost:3000/items/new
  3. Вместо заполнения полей формы, view страницы, источник
  4. Проверьте тэг формы. Он отправляет данные формы в /items/new. т.е. атрибут действия установлен в /items/new. Почему это?

Из документации:

Когда модель представлена ​​строка или символ, если опция: 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

+0

Это имеет смысл! Итак, у меня было первоначально '<% = form_for: item do | f | %> ', не возражаете ли вы объяснить, что делает': item' submit/do? – Iggy

+1

@Iggy Он представляет объект записи, и вы можете передать ему строку или символ. И если у вас есть поле формы, например '<% = f.text_field: name%>', он генерирует следующий html, ', поэтому вы можете получить доступ к name textfield using params [: item] [: name]. Надеюсь, это поможет. Я предпочел бы вторую версию (я обновил свой ответ), потому что вы можете использовать те же частичные для действий 'new' и' edit'. подробнее см. http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for –

0

Попробуйте это в пунктах/new.html.erb

<%= form_for @item do |f| %> 
    <%= f.text_field :name %> 
    <%= f.submit %> 
<% end %> 
Смежные вопросы