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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

1回答

349閲覧

updateメソッドで更新ができないを解決したい。

fdajo

総合スコア13

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2023/06/10 13:04

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • ▲▲機能を動作するようにする

updateメソッドで更新ができないを解決したい。

前提

railsえtodoアプリの開発練習しています。
更新機能を実装中にエラーが発生しました。

Started PATCH "/tasks/:id" for ::1 at 2023-06-10 21:29:23 +0900 Processing by TasksController#update as TURBO_STREAM Parameters: {"authenticity_token"=>"[FILTERED]", "task"=>{"title"=>"rfew"}, "commit"=>"更新", "id"=>":id"} Task Load (0.2ms) SELECT "tasks".* FROM "tasks" WHERE "tasks"."id" = ? LIMIT ? [["id", nil], ["LIMIT", 1]] ↳ app/controllers/tasks_controller.rb:25:in `update' Completed 404 Not Found in 16ms (ActiveRecord: 0.2ms | Allocations: 1229) ActiveRecord::RecordNotFound (Couldn't find Task with 'id'=:id):

該当のソースコード

ruby

1class TasksController < ApplicationController 2 3 def index 4 @tasks = Task.all 5 end 6 7 def new 8 9 end 10 11 def create 12 Task.create(title:params[:title]) 13 redirect_to "/tasks" 14 end 15 16 def edit 17 @task = Task.find(params[:id]) 18 end 19 20 def update 21 @task = Task.find(params[:id]) 22 @task.update(title: params[:title]) 23 redirect_to "/tasks" 24 end 25 26 def destroy 27 @task = Task.find(params[:id]) 28 @task.destroy 29 redirect_to "/tasks" 30 end 31end

edit.html.erb

1<h2>EDIT TASK</h2> 2<%= form_with model: @task, url: "/tasks/:id", local: true do |f| %> 3 <p><%= f.text_field :title %></p> 4 <p><%= f.submit "更新" %></p> 5<% end %>

routes.rb

1Rails.application.routes.draw do 2 get "tasks" => "tasks#index" 3 get "tasks/new" => "tasks#new" 4 post "tasks/create" => "tasks#create" 5 get "tasks/:id/edit" => "tasks#edit" 6 patch "tasks/:id" => "tasks#update" 7 delete "tasks/:id" => "tasks#destroy" 8end 9

試したこと

ルーティングのupdateへ渡すところを以下のように変更しましたが、更新できませんでした。

routes.rb

1 変更前: 2 patch "tasks/:id" => "tasks#update" 3 4変更後: 5 patch "tasks/:id" => "tasks#update", as: :update

それに伴いform_withのurlを以下のように変更

edit.html.erb

1変更前: 2<%= form_with model: @task, url: "/tasks/:id", local: true do |f| %> 3 4変更後: 5<%= form_with model: @task, url: update_path, local: true do |f| %> 6

ストロングパラメーターを設定してやっても見ましたが同じようなエラーです。

以下エラーのTURBO_STREAMが原因かを調べていましたが、正確に理解できませんでしたが、おそらくJavaScriptが動いているように理解しています。
しかし、form_withでlocal: trueにしているので問題ないと考えています。

Processing by TasksController#update as TURBO_STREAM

今の状態はupdateメソッドに値を渡しきれていないと考えています。
なぜなのか教えていただけますでしょうか。
ヒントや可能性でも思いついたら教えていただけますでしょうか。

よろしくお願いします。

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

ruby 3.2.2
Rails 7.0.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

ログを見ると1行目に以下のような記述があります。
Started PATCH "/tasks/:id"
Patch(UPDATE)をしているURLが /tasks/:id であるとわかります。

ここには本来、1,2,3といったデータベースに記録されているidが入ります。
今はidが入っておらず、:idという文字列になっています。
その結果、 Completed 404 Not Found in 16ms (ActiveRecord: 0.2ms | Allocations: 1229) という404エラーになっています。つまり:id番というデータが見つからなかったという結果です。

よって、今出ているエラーを解消するには、idを正しくしてあげるといいです。

Before

<%= form_with model: @task, url: "/tasks/:id", local: true do |f| %>

After

<%= form_with model: @task, url: "/tasks/#{@task.id}", local: true do |f| %>

のように、@task.idを渡してあげるなどが解決策の1つです。

routes.rbの書き方にもよりますが、urlの部分は
url: tasks_path(id: @task.id)のような書き方も考えられます。

投稿2023/06/10 15:41

hatsu

総合スコア1809

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

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

winterboum

2023/06/11 01:17

form_with model: @task, があるなら url: オプションはなくても良いです。 つけずに form_withに委ねたほうがトラブル起きにくいです。 url をつけるのは model: @task から自然に導かれるURL ではないところに飛ばしたいとき。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問