質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

3回答

1587閲覧

railsで在庫管理サイトを作っている

yukihiro_3710

総合スコア6

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/02/26 11:13

前提・実現したいこと

現在railsで、在庫管理のサイトを作成しておりまして編集機能をつけて編集をできるようにしようとしているのですが機能がうまく反応せずにエラーになっています

発生している問題・エラーメッセージ

ActiveRecord::RecordNotFound in ItemsController#update Couldn't find Item with 'id'=edit Extracted source (around line #31): 29 30 31 32 33 34 def update @item = Item.find(params[:id]) @item.update(item_params) redirect_to root_path end Rails.root: /Users/yukihiro/stock Application Trace | Framework Trace | Full Trace app/controllers/items_controller.rb:31:in `update' Request Parameters: {"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"EyDppYB3jJCZgj+uoZh4MgaAWy0HFtV8XR8zvZjujdh4PvA7OwcXdfUpHdH+g/lYqsqzmFuhT77bcUGc1/8iZg==", "item"=>{"name"=>"mo", "capacity"=>"342", "until"=>"kg", "quantity"=>"45個", "place"=>"1番冷蔵庫", "deliverydate"=>"5月25日"}, "commit"=>"変更する", "id"=>"edit"}

該当のソースコード

rails

1class ItemsController < ApplicationController 2 def index 3 @items = Item.all 4 end 5 6 def new 7 @item = Item.new 8 end 9 10 def create 11 @item = Item.new(item_params) 12 if @item.save 13 redirect_to root_path 14 else 15 render :new 16 end 17 end 18 19 20 def destroy 21 item = Item.find(params[:id]) 22 item.destroy 23 redirect_to root_path 24 end 25 26 def edit 27 @item = Item.find(params[:id]) 28 end 29 30 def update 31 @item = Item.find(params[:id]) 32 @item.update(item_params) 33 redirect_to root_path 34 end 35 36 37 private 38 def item_params 39 params.permit(:name, :capacity, :until, :quantity, :place, :deliverydate) 40 # params.require(:item).permit(:name, :capacity, :until, :quantity, :place, :deliverydate) 41 end 42 43end
= form_with(url: "/items/edit",model: @item, local: true )do |f| .edit .edit_header .edit_header_name =link_to "NETASTOCKS",root_path,class:'neta' .edit_main .edit_main_title 在庫編集 .edit_main_box .edit_main_box_text .box .box_box = link_to '削除', "/items/#{@item.id}", method: :delete,class: "destroy" .form_text .field %label 材料名 = f.text_field :name,class: 'text' .field %label 容量 = f.number_field :capacity,class: 'text' .field %label 単位 = f.select :until,[ ["g","g"], ["kg", "kg"],["t","t"], ["個", "個"],["パック","パック"], ["枚", "枚"]], prompt: "---" .field %label 個数 = f.text_field :quantity,class: 'text' .field %label 場所 = f.select :place,[ ["プレハブ","プレハブ"], ["リーチイン", "リーチイン"], ["1番冷蔵庫", "1番冷蔵庫"], ["2番冷蔵庫", "2番冷蔵庫"], ["3番冷蔵庫", "3番冷蔵庫"], ["1番冷凍庫", "1番冷凍庫"], ["2番冷凍庫", "2番冷凍庫"] , ["切りネタ冷凍庫", "切りネタ冷凍庫"], ["ハマチ倉庫", "ハマチ倉庫"], ["ネタ切り冷蔵庫", "ネタ切り冷蔵庫"]], prompt: "---" .field %label 納品日 = f.text_field :deliverydate,class: 'text' .form_text_btn = f.submit '変更する',class: :form__btn
Rails.application.routes.draw do root to: "items#index" resources :items, only: [:index, :new,:edit,:destroy,:update]do collection do post 'create', to: 'items#create' end end end

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

form_withのurl指定が間違っていますね。

editのアクションのurlにはどのアイテムかを判別するために、idの値が入るはずです。なので、/items/:id/editのような形になります。
エラーの内容を見ると
Couldn't find Item with 'id'=edit
とあります。普通、idには数字が入ります。しかし、今はid=editになっていて、そんなurlは見つかりませんと言っています。
これは、form_with(url: "/items/edit")としているのが原因です。

修正方法は自信ないのですが、urlの指定を、"/items/#{@item.id}/edit"とするか、prefixで書くなら、edit_item_path(@item)と書いてみると、直るかもしれません。

urlやprefixを確かめるには、ターミナルで、rails routesをすると確認できます。

投稿2020/02/26 11:27

clora

総合スコア72

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

paramsのIDに"edit"が入っているのが原因の様ですね、この場合IDが必要なのでルーティングがcollectionではなくmemberではないでしょうか?

https://qiita.com/hirokihello/items/fa82863ab10a3052d2ff

投稿2020/02/26 11:27

fumiya0414

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

form_with の url の指定が誤っているので、コントローラーに適切に params[:id] を渡せていないのが原因だと思います。

シンプルに書くのであれば、以下のように書いて動作しないでしょうか?
(Rails のレールにのっているのであれば、url を指定しなくてもよしなに設定してくれる気がします)

slim

1= form_with(model: @item, local: true) do |f|

もし明示的に url を指定するのであれば、以下のように書くとできると思います。

slim

1= form_with(url: edit_item_path, model: @item, local: true) do |f|

Rails 5.1〜_ 'form_with' APIドキュメント完全翻訳|TechRacho

投稿2020/02/26 11:22

shgtkshruch

総合スコア665

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukihiro_3710

2020/02/26 11:36

ご返信ありがとうございます。 上記の記載でシンプルな書き方をしたのですが編集したデータがデータベースに保存されずにtopページにもどてっしまいました。 保存を反映させるにはどのような記載をしたらよろしいでしょうか。
shgtkshruch

2020/02/26 11:45

今のコードですと`update`アクションで保存が成功しても失敗しても`root_path`つまり、トップページにリダイレクトする実装になっているので、実装してるとおりに動作していると思います。 データが保存できていない原因をしては、itemモデルのバリデーションで弾かれているかもしれません。 通常は、データの保存に失敗したら元の編集画面に戻すような実装をすることが多いです。 こちらはRailsのドキュメントからの引用です。 ```rb def update @article = Article.find(params[:id]) if @article.update(article_params) # 保存に成功したら任意のページへリダイレクト redirect_to @article else # 保存に失敗したら編集画面へ戻す render 'edit' end end ``` ドキュメントに基本的な実装方法が書いてあるので、ご存知だとは思いますがもう一度確認されるといいと思います。 https://railsguides.jp/getting_started.html#%E8%A8%98%E4%BA%8B%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問