2016-08-13 45 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"を出力します。私は私のルートを確認するために、このSO postからの提案に従っ

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

、これは私が持っているものです。私はルートを熊手に行くときに、エラーが」

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

saveが失敗したときに、私のセットアップを警告します):

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. は、formタグをチェックする代わりに、フォームフィールドに記入のhttp://localhost:3000/items/new
  2. viewソースページ
  3. rails s
  4. Go]を使用して、レール・サーバを起動します。フォームデータを/items/newに送信しています。すなわち、アクション属性は/items/newに設定される。何故ですか?

    モデルは、文字列または記号で表される場合ならば、::URLオプションが指定されていない、デフォルトでフォームが戻って現在のURLに送信されます(私たちのドキュメントから

以下では、URLを明示的に指定する必要がないform_forの代替リソース指向の使用方法について説明します)。あなたのroutes.rb

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

は、これは、formタグを生成POST /items/new

だから、

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

にフォームを変更一致するルートがないどの/itemsではなく/items/newからpost sのデータ。

それとも今

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

でフォームを置き換える、フォームは/itemsに提出されます。 2番目のバージョンを使用する利点は、新しいオブジェクトを作成して既存のオブジェクトを単一のビュー(部分)に更新するためにフォームを乾燥させることができることです。

詳細については、http://guides.rubyonrails.org/form_helpers.html#binding-a-form-to-an-object

+0

これは意味があります。だから私が最初に持っていたのは '<%= form_for:item do | f | %> '、':item'は何を表しているのかを説明していますか? – Iggy

+1

@Iggyこれはレコードオブジェクトを表し、文字列またはシンボルを渡すことができます。 '<%= f.text_field:name%>'のようなフォームフィールドを持っているなら、次のHTMLを生成します。 ' params [:item] [:name]を使って、名前のテキストフィールドを作成することができます(これは私の答えを更新しました)。詳細は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 %> 
関連する問題