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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

993閲覧

ストロングパラメーターを使って値を取得したい

ren0826nosuke

総合スコア34

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/04/13 10:31

編集2020/04/13 13:27

解決したい事

フォームで送った値をストロングパラメーターを使って取得したい。

現状

目標管理アプリを製作中です。(利用環境は、「rails 5.2.3」「ruby 2.5.1」)
まず、新規作成画面から作成しました。このページで入力した値をコントローラーで取得しようとストロングパラメーターを設定したのですが、新規作成ページにアクセスすると以下のエラーが発生しページに入れませんでした。
「LoadError in TargetsController#new」
「Unable to autoload constant PriorityCategory, expected /Users/ren0826nosuke/Desktop/projects/target-app/app/models/priority_category.rb to define it」
ストロングパラメーター定義部分がエラー該当箇所なのですがどこかおかしな点はありますか?
ちなみにform_withを使っています。
データベース(モデル)はTargetモデル(目標の情報を入っている)、Categoryモデル(カテゴリの情報が入っている)、Priority_categoryモデル(優先度の情報が入っている)の3つがあります。
※関係あるかわかりませんが、Bootstrapも使用してます。

試してみた事

ストロングパラメーターの「permit(:target)」部分を消してみた。=>引き続きエラー発生
permitの中の「category」と「priority」を.merge(category:category.name, priority:priority_category.name)と記述を変更してみた。=>変化なし

##コード記述

コントローラーの記述は以下の通りです。(targets_controller.rb)

ruby

1class TargetsController < ApplicationController 2 # before_action :move_to_index, only: [:new] 3 4 def index 5 6 end 7 8 def new 9 @target=Target.new 10 @category=Category.all 11 @priority=Priority_category.all 12 Target.create(target_params) 13 end 14 15 def show 16 17 end 18 19 def create 20 @target = Group.create(target_params) 21 if @target.save 22 redirect_to root_path 23 else 24 render :new 25 end 26 end 27 28 def edit 29 30 end 31 32 def update 33 34 end 35 36 def delete 37 38 end 39 40 private 41 def target_params 42 params.require(:target).permit(:title, :price, :date, :memo, :created_at).merge(targets_category: category.name,priority: priority_category.name) 43 #上記がエラー該当部分です。 44 end 45 46 def move_to_index 47 redirect_to "/" 48 end 49end 50

新規作成ページの記述は以下の通りです。(new.html.erb)

ruby

1<div class="container"> 2 <%= form_with model:@target, local:true do |form| %> 3 <div class="form-group"> 4 <%= form.label :title , "タイトル" %> 5 <%=form.text_field :title ,class:"form-control",placeholder:"タイトル" %> 6 </div> 7 8 <div class="form-group"> 9 <%= form.label :targets_category, "カテゴリ" %><br> 10 <%= form.select :targets_category, @category.map{|category|[category.name,category.id]} %> 11 </div> 12 13 <div class="form-group"> 14 <%= form.label :price , "予算・価格" %> 15 <%=form.text_field :price ,class:"form-control", value:"¥" %> 16 </div> 17 18 <div class="form-group"> 19 <%= form.label :date , "期日" %><br> 20 <%=form.date_select( 21 :date, 22 use_month_numbers: true, 23 start_year: 1998, 24 end_year: (Time.now.year + 100), 25 class:"form-control" 26 )%> 27 </div> 28 29 <div class="form-group"> 30 <%= form.label :memo , "メモ" %> 31 <%=form.text_area :memo ,class:"form-control",placeholder:"メモ" %> 32 </div> 33 34 <div class="form-group"> 35 <%= form.label :priority, "優先度" %><br> 36 <%= form.select :priority, @priority.map{|priority|[priority.name,priority.id]} %> 37 </div> 38 39 <div class="form-group"> 40 <%= form.label :created_at , "作成日" %><br> 41 <%=form.date_select( 42 :created_at, 43 use_month_numbers: true, 44 start_year: 1998, 45 end_year: (Time.now.year + 100), 46 class:"form-control" 47 )%> 48 </div> 49 50 <%=form.submit "作成" ,class:"btn btn-primary btn-lg active"%> 51 52 <% end %> 53</div>

追記

target.rb

ruby

1class Target < ApplicationRecord 2 belongs_to :category 3 belongs_to :priority_category 4 5 validates :title, presence: true 6 validates :price, numericality: { only_integer: true },presence: true 7end

priority_category.rb

ruby

1class Priority_category < ApplicationRecord 2 has_many :targets 3end 4

category.rb

ruby

1class Category < ApplicationRecord 2 has_many :targets 3end 4

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーが顕在化したのはそこかもしれませんが、原因は他にあります。
Unable to autoload constant PriorityCategory, expected /Users/ren0826nosuke/Desktop/projects/target-app/app/models/priority_category.rb to define it
とあるように、「PriorityCategory の定義がない。priority_category.rb に書いてあると思ったのに。 」が原因です。
他にも気になる所が有りますので、app/modelsにある
priority_category.rb、targets_category.rb, target.rb, category.rb, priority.rb の関連定義部分を載せてください。

追記
問題いろいろあります
0. priority_category.rb の定義が class Priority_category ですね、class PriorityCategoryでなければなりません。
これで質問のエラーは消えますが、、、
0. モデルの関連がとても違和感あります。
PriorityとCategoryとPriorityCategoryがあると多くはPriorityとCategoryが互いに多対多でPriorityCategoryが がそれをつなぐtableです。
PriorityとCategoryとPriorityCategoryの関係を日本語で説明いただけますか?
0. viewに:targets_categoryというのがあります。Targetにその定義有りますか?

投稿2020/04/13 13:15

編集2020/04/13 13:53
winterboum

総合スコア23567

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

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

ren0826nosuke

2020/04/13 13:28

モデル部分を追記しました!よろしくお願いします!
winterboum

2020/04/13 13:31

priority_category.rb はないんですね?
ren0826nosuke

2020/04/13 13:39

追記した2つ目の内容が、priority_category.rbの内容になります。 初心者のため質問の内容が汲み取れていなければすいません。。
winterboum

2020/04/13 13:44 編集

あ、読み違えてたかな、それですね
ren0826nosuke

2020/04/13 13:47

この後どのように修正していけばいいでしょうか?
ren0826nosuke

2020/04/14 03:00 編集

1.修正しました! ※エラー内容は変わりませんでしたが、エラーの該当箇所が以下に変更していました。 targetsコントローラーのnewアクション def new @target=Target.new @category=Category.all @priority=Priority_category.all Target.create(target_params) end 2.Targetモデル(目標の情報)とCategoryモデル(カテゴリの情報)とPriority_categoryモデル(優先度の情報)があります。Targetは1つのCategory、1つのPriority_categoryに属しているので1対多の関係になります。CategoryとPriority_categoryは特に関係性はありません。(未定義) 3.integer型で "targets_category"が定義されています。
winterboum

2020/04/14 03:03

Categoryに優先度があるわけでは無いのですね。 するとあまり良くない命名ですね、PriorityCategoryは。誤解を招きやすい。 単にPriorityではだめなのかな。 target_categoryも誤解を招き、かつrailsの標準(規約)に外れる命名です。 外れても動きますし、外さざるを得ない時もありますが、そうでない場合は規約に則る方が読む人の負担も誤解もへります。 targetがどのcategoryに属するかそのidを記録するなら category_id とするのがrailsです。 belongs_to :category と定義するとRailsは category_id があると理解します。そうではなく targets_categoryを使うなら定義にoptionが必要です。
ren0826nosuke

2020/04/14 03:22

モデル名 Priority_category→Priorityに変更 カラム名 targets_category→category_id priority_category→priority に変更しました!
ren0826nosuke

2020/04/14 04:32

エラー解決しました!ありがとうございます! その後、新規作成しcreateアクションを実行するとまた同じようなエラーが発生してしまいました。 新たに質問を出しているのでよろしければそちらでもお力添えをお願いします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問