Я пытаюсь создать базовое создание элемента в рельсах, но у меня возникли проблемы с созданием нового элемента. Я хочу создать элемент 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
)
Что я пропустил?
Это имеет смысл! Итак, у меня было первоначально '<% = form_for: item do | f | %> ', не возражаете ли вы объяснить, что делает': item' submit/do? – Iggy
@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 –