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

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

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

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

Q&A

解決済

1回答

913閲覧

データを保存しようとすると、Account book translation missingエラーが出る

mmmseng

総合スコア2

Ruby on Rails 6

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

0グッド

0クリップ

投稿2022/08/12 04:44

プログラミング初心者です。
分からに事が多くわかりづらい部分があると思いますが、
その点はご指摘いただけますと幸いです。

家計簿アプリを作成しています。

帳簿は複数あり、それぞれの中に利用科目、
またその中に利用細目を1つのビューから保存したいとおもい、
実装していたのですが、ボタンを押してもrenderが動いて
同じビューが表示されるのでエラーを出して何が原因かを確認したところ、

エラー内容

エラーが発生したため bop subject は保存されませんでした。 Account book translation missing: ja.activerecord.errors.models.bop_subject.attributes.account_book.required

というエラーが表示されました。
いろいろと検索してみましたがよくわかりません。
translation => 翻訳?
attributes  => 属性?
required  => 必要?
accountbookに対してか記述が誤っているということ??

該当のソースコード

account_book.rb

class AccountBook < ApplicationRecord has_many :bop_subjects, dependent: :destroy end

bop_subject.rb

class BopSubject < ApplicationRecord has_many :bop_details, dependent: :destroy belongs_to :account_book enum bop: { balance: 0, payments: 1 } def save_detail(sent_details) self.bop_details << sent_details current_details = self.details.pluck(:name) unless self.details.nil? old_details = current_details - sent_details new_details = sent_details - current_details old_details.each do |old| self.details.delete Detail.find_by(name: old) end new_details.each do |new| new_post_detail = Detail.find_or_create_by(name: new) self.details << new_post_detail end end end

bop_detail.rb

class BopDetail < ApplicationRecord belongs_to :bop_subject end

bop_subject_controller.rb

class Public::BopSubjectsController < ApplicationController def new @bop_subject = BopSubject.new end def create @bop_subject = BopSubject.new(bop_subject_params) @bop_subject.end_user_id = current_end_user.id detail_list = params[:bop_subject][:detail_name] if @bop_subject.save @bop_subject.save_detail(detail_list) redirect_to bop_subject_path(@bop_subject) else render :new end end def show end def edit end private def bop_subject_params params.require(:bop_subject).permit(:subject_name, :bop, :price, :point, :memo, :registered_person_id) end end

bop_subjects/new.html.erb

<div class="col-lg-10 col-md-12 mt-5 mx-auto"> <div class="card"> <div class="m-5"> <h3>収支登録</h3> <div style="display:inline-flex"> </div> <%= form_with model: @bop_subject, url: bop_subjects_path, method: :post do |f| %> <%= render "layouts/error", obj: @bop_subject %> <%= render "public/shared/error_messages", resource: @bop_subject %> <div class="form-group row"> <div class="btn-group col-12" data-toggle="buttons"> <label class="col-6 btn btn-outline-secondary active"> <%= f.radio_button :bop, "payments", {checked: true} %>支出 </label> <label class="col-6 btn btn-outline-secondary"> <%= f.radio_button :bop, "balance" %>収入 </label> </div> </div> <div class="form-group"> <%= f.label :account_book_id, "帳簿" %> <%= f.collection_select :account_book_id, AccountBook.all, :id, :name %> </div> <div class="form-group"> <%= f.label :use_at, "利用日" %> <%= f.date_field :use_at, class: "form-control" %> </div> <div class="form-group"> <%= f.label :price, "利用額" %> <%= f.text_field :price, data: { autonumeric: { aSign: '¥ ', mDec: 0 } }, class: "detail_total_price form-control" %> </div> <div class="form-group"> <%= f.label :subject_name, "利用科目" %> <%= f.text_field :subject_name, class: "form-control" %> </div> <div class="form-group"> <p>利用細目</p> <div style="display:inline-flex"> <%= f.text_field :subject_name, :placeholder => "科目名(例:食費など)", class: "form-control mr-3" %> <%= f.text_field :detail_name, :placeholder => "細目名(例:バナナなど)", class: "form-control mr-3" %> <%= f.text_field :amount, :placeholder => "×3", class: "form-control mr-3" %> <%#= f.text_field : %> <%= f.text_field :detail_price, :placeholder => "¥10,000,000", class: "detail_price form-control" %> </div> </div> <div class="form-group"> <div style="display:inline-flex"> <%= f.label :point, "ポイント利用", class: "col-4"%> <%= f.text_field :point, class: "point form-control" %> <p class="d-flex align-items-center mx-3">➡</p> <div clasS="col-4 align-items-center"> <!--<p clas="total_price ">total_price</p>--> <%= f.text_field :total_price, class: "total_price form-control" %> </div> </div> </div> <div class="form-group"> <%= f.label :store, "利用店" %> <%= f.text_field :store, class: "form-control" %> </div> <div class="form-group"> <%= f.label :memo, "メモ" %> <%= f.text_field :memo, class: "form-control" %> </div> <%= f.submit "登録", class: "btn btn-success col-12" %> <% end %> </div> </div> </div>

試したこと

・アソシエーションの確認
・devise.ja.ymlの作成
・新規作成ページにaccountbookのセレクトボックスを追加
を行ってみたのですが、エラーの解消ができませんでした。

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

rails 6
ruby 3

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

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

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

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

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

guest

回答1

0

ベストアンサー

この Account book translation missing: はエラーの本質ではないです。
「エラーが発生したため bop subject は保存されませんでした。」に関わるエラーメッセージを日本語化する辞書に
ja.activerecord.errors.models.bop_subject.attributes.account_book.required
が載っていなかったというものです。
この部分の解決は i18n とか エラーメッセージの日本語化 あたりをkeyに調べると出てくるでしょう。

で、
それエラーがなんで起きているか、は 一時的に if @bop_subject.save を if @bop_subject.save! にして試してください。

追記
class BopSubject は
belongs_to :account_book
とされていますので、
実在する AccountBook の id が account_book_id にないとvalidationエラーになります

投稿2022/08/12 07:19

編集2022/08/12 09:50
winterboum

総合スコア23347

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

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

mmmseng

2022/08/12 08:29

お世話になっております。 ご回答いいただきまして、ありがとうございます。 教えていただいたとおりに、if @bop_subject.save! を試しましたが、 下記のようなエラーが出ました。 << エラー文 >> ActiveRecord::RecordInvalid in Public::BopSubjectsController#create バリデーションに失敗しました: Account book translation missing: ja.activerecord.errors.models.bop_subject.attributes.account_book.required 8  @bop_subject.end_user_id = current_end_user.id 9  detail_list = params[:bop_subject][:detail_name] 10  if @bop_subject.save!  <=ここで止まっている ------------------------------エラー文ここまで------------------------------ なんのバリデーションかわからなかったので、 一旦if @bop_subject.save!(:validate => false)として再度試しましたが、 << エラー文 >> ActiveRecord::AssociationTypeMismatch in Public::BopSubjectsController#create BopDetail(#65920) expected, got "バナナ" which is an instance of String(#2960) Extracted source (around line #9): 7 8 def save_detail(sent_details) 9 self.bop_details << sent_details <=ここで止まっている ------------------------------エラー文ここまで------------------------------ とのエラーが出ています。 現在、バリデーションはカラムの作成時のみつけています。 BopDetail(#65920) expected, got "バナナ" which is an instance of String(#2960)の記載を調べたところ、バナナがStringだから変だよみたいな意味らしいのですが、バナナ(bop_detail_name)はstringなので何が異なるのかがわかりません。
winterboum

2022/08/12 09:47

ja.activerecord.errors.models.bop_subject.attributes.account_book.required を翻訳しますと models. bop_subject の account_book は .required必須です
mmmseng

2022/08/12 14:29

お世話になっております。 ご回答いただきありがとうございます。 投稿の情報には入れてるのですが、何がいけないのかさっぱりわかりません。 今日は確認出来ないので明日自分なりにもう一度確認してみます!
winterboum

2022/08/12 22:10

bop_subject_params に入ってませんよ。
mmmseng

2022/08/13 03:45

ご指摘いただいた通りでした!! エラーが出た際に、viewにフォーマットを追加して、paramsに追加し忘れていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問