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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

917閲覧

ActiveRecord::RecordNotFound in HouseholdAccountBooksController#update_one_month_2

sh11821783

総合スコア0

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/04/18 06:21

前提・実現したいこと

idを拾い、収入の項目を記入できるようにしたい。

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

Rhbyで家計簿管理システムを作っています。
収入を記載する機能を実装中に以下のエラーメッセージが発生しました。
idを拾いたいと考えているのですが、before_actionにもストロングパラメーターにも定義しているのですが、上手く拾うことができず、idが拾えず困っております。

エラーメッセージ ```![イメージ説明](17da344fb9a929186900abad5d7a701b.png) ![イメージ説明](f3e4d5bdc93f028d33b9ad2a2c395a98.png) ### コントローラー ```class HouseholdAccountBooksController < ApplicationController before_action :set_user, only: [:update_one_month, :edit_one_month, :edit_one_month_1, :update_one_month_1, :edit_one_month_2, :update_one_month_2] before_action :logged_in_user, only: [:update, :edit_one_month, :edit_one_month_1, :edit_one_month_2] before_action :set_one_month, only: [:edit_one_month, :edit_one_month_1, :edit_one_month_2] UPDATE_ERROR_MSG = "編集に失敗しました。やり直してください。" def update @user = User.find(params[:user_id]) @household_account_book = HouseholdAccountBook.find(params[:id]) if @user.update(household_account_books_params) flash[:success] = "Your account was updated" redirect_to @user else render 'edit' end end # 固定費の編集画面 def edit_one_month @household_accounnt_book = @user.household_account_books.find_by(worked_on: @first_day) end # 固定費の更新 def update_one_month ActiveRecord::Base.transaction do household_account_books_params.each do |id, item| household_account_book = HouseholdAccountBook.find(id) household_account_book.update_attributes!(item) end flash[:success] = "1ヶ月分の固定費を書き込みました。" redirect_to user_url(date: params[:date]) rescue ActiveRecord::RecordInvalid # トランザクションによるエラーの分岐です flash[:danger] = "無効な入力データがあった為、更新をキャンセルしました。" redirect_to household_account_books_edit_one_month_user_url(date: params[:date]) end end # 変動費の編集画面 def edit_one_month_1 @household_accounnt_book = @user.household_account_books.find_by(worked_on: @first_day) end # 変動費の更新 def update_one_month_1 ActiveRecord::Base.transaction do household_account_books_1_params.each do |id, item| household_account_book = HouseholdAccountBook.find(id) household_account_book.update_attributes!(item) end flash[:success] = "1ヶ月分の変動費を書き込みました。" redirect_to show_1_user_url(date: params[:date]) rescue ActiveRecord::RecordInvalid # トランザクションによるエラーの分岐です flash[:danger] = "無効な入力データがあった為、更新をキャンセルしました。" redirect_to household_account_books_edit_one_month_1_user_url(date: params[:date]) end end # 収入の編集画面 def edit_one_month_2 @household_accounnt_book = @user.household_account_books.find_by(worked_on: @first_day) end # 収入の更新 def update_one_month_2 ActiveRecord::Base.transaction do household_account_books_2_params.each do |id, item| household_account_book = HouseholdAccountBook.find(id) household_account_book.update_attributes!(item) end flash[:success] = "1ヶ月分の収入を書き込みました。" redirect_to show_2_user_url(date: params[:date]) rescue ActiveRecord::RecordInvalid # トランザクションによるエラーの分岐です flash[:danger] = "無効な入力データがあった為、更新をキャンセルしました。" redirect_to household_account_books_edit_one_month_2_user_url(date: params[:date]) end end private # 1ヶ月分のを扱います。 def household_account_books_params params.require(:user).permit(household_account_books: [:fixed_cost, :fixed_cost_1, :fixed_cost_2, :fixed_cost_3, :fixed_cost_4, :fixed_cost_5, :fixed_cost_6, :fixed_cost_7, :fixed_cost_8, :fixed_cost_9, :fixed_cost_10, :fixed_cost_11, :fixed_cost_12, :fixed_cost_13, :fixed_cost_14, :fixed_cost_15, :fixed_n, :fixed_n_1, :fixed_n_2, :fixed_n_3, :fixed_n_4, :fixed_n_5, :fixed_n_6, :fixed_n_7, :fixed_n_8, :fixed_n_9, :fixed_n_10, :fixed_n_11, :fixed_n_12, :fixed_n_13, :fixed_n_14, :fixed_n_15, :note])[:household_account_books] end def household_account_books_1_params params.require(:user).permit(household_account_books: [:variable_cost, :variable_cost_1, :variable_cost_2, :variable_cost_3, :variable_cost_4, :variable_cost_5, :variable_cost_6, :variable_cost_7, :variable_cost_8, :variable_cost_9, :variable_cost_10, :variable_cost_11, :variable_cost_12, :variable_cost_13, :variable_cost_14, :variable_cost_15, :variable_n, :variable_n_1, :variable_n_2, :variable_n_3, :variable_n_4, :variable_n_5, :variable_n_6, :variable_n_7, :variable_n_8, :variable_n_9, :variable_n_10, :variable_n_11, :variable_n_12, :variable_n_13, :variable_n_14, :variable_n_15, :note])[:household_account_books] end def household_account_books_2_params params.require(:user).permit(household_account_books: [ :income, :income_1, :income_2, :income_3, :income_4, :income_5, :income_n, :income_n_1, :income_n_2, :income_n_3, :income_n_4, :income_n_5]) end end

ビュー

<% provide(:title, @user.name) %> <%= form_with(model: @user, url: household_account_books_update_one_month_2_user_path(date: @first_day), local: true, method: :patch) do |f| %> <div> <h1>家計簿記載画面【収入】</h1> <table class="table table-bordered table-condensed table-hover" id="table-attendances"> <% n = 0 %> <% @household_account_books.each do |household_account_book| %> <%= f.fields_for "household_account_books[]", household_account_book do |h| %> <% if n == 0 %> <thead> <tr> <th>日付</th> <th>曜日</th> <th><%= h.select :income, [['収入(1)'], ['収入(2)'], ['収入(3)'], ['収入(4)'], ['収入(5)']], { include_blank: true, selected: @household_accounnt_book.income }, { id: "household_account_book", class: "household_account_book_class" } %></th> <th><%= h.select :income_1, [['収入(1)'], ['収入(2)'], ['収入(3)'], ['収入(4)'], ['収入(5)']], { include_blank: true, selected: @household_accounnt_book.income_1 }, { id: "household_account_book", class: "household_account_book_class" } %></th> <th><%= h.select :income_2, [['収入(1)'], ['収入(2)'], ['収入(3)'], ['収入(4)'], ['収入(5)']], { include_blank: true, selected: @household_accounnt_book.income_2 }, { id: "household_account_book", class: "household_account_book_class" } %></th> <th><%= h.select :income_3, [['収入(1)'], ['収入(2)'], ['収入(3)'], ['収入(4)'], ['収入(5)']], { include_blank: true, selected: @household_accounnt_book.income_3 }, { id: "household_account_book", class: "household_account_book_class" } %></th> <th><%= h.select :income_4, [['収入(1)'], ['収入(2)'], ['収入(3)'], ['収入(4)'], ['収入(5)']], { include_blank: true, selected: @household_accounnt_book.income_4 }, { id: "household_account_book", class: "household_account_book_class" } %></th> <th>備考</th> </tr> </thead> <% n = 1 %> <% end %> <tbody> <tr> <td><%= l(household_account_book.worked_on, format: :short) %></td> <td><%= $days_of_the_week[household_account_book.worked_on.wday] %></td> <td><%= h.number_field :income_n, class: "form-control" %></td> <td><%= h.number_field :income_n_1, class: "form-control" %></td> <td><%= h.number_field :income_n_2, class: "form-control" %></td> <td><%= h.number_field :income_n_3, class: "form-control" %></td> <td><%= h.number_field :income_n_4, class: "form-control" %></td> <td><%= h.text_field :note %></td> </tr> </tbody> <% end %> <% end %> </table> </div> <div class="center"> <%= f.submit "まとめて更新", class: "btn btn-lg btn-primary" %> <%= link_to "キャンセル", show_2_user_url(date: @first_day), class: "btn btn-lg btn-default" %> </div> <% end %>

ルート

Rails.application.routes.draw do root 'static_pages#top' get '/signup', to: 'users#new' post '/callback' => 'linebot#callback' # ログイン機能 get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' delete '/logout', to: 'sessions#destroy' resources :users do member do get 'edit_basic_info' patch 'update_basic_info' get 'household_account_books/edit_one_month' patch 'household_account_books/update_one_month' get 'household_account_books/edit_one_month_1' patch 'household_account_books/update_one_month_1' get 'household_account_books/edit_one_month_2' patch 'household_account_books/update_one_month_2' get 'show_1' get 'show_2' end resources :household_account_book, only: :update do member do end end end end

試したこと

idを拾わなくても良いようにすれば良いのでは?と思い、ルートにcollect> 引用テキストionで書こうとしたのですが、今まで同じ作り方で他のページ(経費画面)作成できたので、id拾って作成したい、、というより、ログインユーザーの作成画面なんだからid拾わないとだめだろうなと思いハマっている状態です。
ご教授お願い致します。

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

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

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

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

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

guest

回答2

0

自己解決

結局ストロングパラメータの中を元に戻して、何故エラーになっているのかを見ていると、ストロングパラメータには、
:income, :income_1, :income_2, :income_3, :income_4, :income_5,
:income_n, :income_n_1, :income_n_2, :income_n_3, :income_n_4, :income_n_5
と書かれているのに、vueの法では、それぞれ
income_4とincome_n_4までしか書かれておらず、ここにincome_5、income_n_5を追加すると更新できるようになりました!

投稿2021/05/03 13:13

sh11821783

総合スコア0

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

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

0

エラー画面を見ると,

with 'id'=household_account_books

となっているので,数であるべき id がなぜか文字列になっているぽいですね。

問題の箇所はコントローラーの update_one_month_2 アクションの

rb

1 household_account_books_2_params.each do |id, item| 2 household_account_book = HouseholdAccountBook.find(id) 3 household_account_book.update_attributes!(item) 4 end

です。each の第一ブロックパラメーター id の値が想定と違うようです。
ということは,household_account_books_2_params メソッドの返り値がおかしいのでしょうか?

household_account_books_2_params の定義を見ます。

rb

1 def household_account_books_2_params 2 params.require(:user).permit(household_account_books: [ :income, :income_1, :income_2, :income_3, :income_4, :income_5, 3 :income_n, :income_n_1, :income_n_2, :income_n_3, :income_n_4, :income_n_5]) 4 end

ですね。
params から user の部分を取ってきています。

では,params の返り値は何でしょう?

リクエストの「Parameters:」を見ると,

rb

1{ 2 # 略 3 "user" => 4 {"household_account_books"=> 5 {"31"=>{"income"=>"云々" 6 # 略 7}

のようになっています。
おやおや。ここから user の部分を取ってきたら

rb

1 {"household_account_books"=> 2 {"31"=>{"income"=>"云々" 3 # 略

ですよね。
こいつを each で回したら,第一ブロックパラメーターは "household_account_books" です。エラーの直接の原因はコレですね。

本当は

rb

1 {"31"=>{"income"=>"云々" 2 # 略

の部分を each で回したかったのではありませんか?

であれば household_account_books_2_params の定義は

rb

1params.require(:user).require(:household_account_books).permit(云々

のようにもう一段 require をかますのが正しいのではないでしょうか?

投稿2021/04/21 18:26

scivola

総合スコア2108

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

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

sh11821783

2021/04/29 08:19

お世話になっております! 上記のアドバイス通りに書き換えましたところエラー解消されました! 有難うごいます! しかし、この後、数値を更新すると更新しましたとメッセージは出るものの、incomeに数値が入っていないのか、更新されません。何が原因なのか、、お忙しい中対応して頂き有難うございます!もう少しお力お借りできませんでしょうか!
scivola

2021/04/29 09:22

permit のほうをそのままにしていますよね? それだと household_account_books_2_params の返り値は空っぽのデータになると思います。 今の場合,household_account_books_2_params では permit はせずに,update_one_month_2 アクションの household_account_books_2_params.each do |id, item| end のループ内で,item に対して permit をかましたものを update_attributes に渡せばいいのだと思います。 つまり, household_account_book.update_attributes!(item) じゃなくて household_account_book.update_attributes!(item.permit(:income, 云々)) みたいな感じに。
sh11821783

2021/05/03 13:11

いつもお世話になっております! こちらどうにか解決いたしました! 結局ストロングパラメータの中を元に戻して、何故エラーになっているのかを見ていると、ストロングパラメータには、 :income, :income_1, :income_2, :income_3, :income_4, :income_5, :income_n, :income_n_1, :income_n_2, :income_n_3, :income_n_4, :income_n_5 と書かれているのに、vueの法では、それぞれ income_4とincome_n_4までしか書かれておらず、ここにincome_5、income_n_5を追加すると更新できるようになりました!ご親切に色々とアドバイスして頂き有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問