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

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

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

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

Ruby

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

Ruby on Rails 3

Ruby on Rails3はRubyによって書かれたオープンソースのウェブフレームワークです。Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

2回答

688閲覧

Setupで中間テーブルの値をどのようにして渡せば良いのか

KokiOya

総合スコア27

Ruby on Rails 5

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

Ruby

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

Ruby on Rails 3

Ruby on Rails3はRubyによって書かれたオープンソースのウェブフレームワークです。Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2020/01/03 12:10

実現したいこと

中間テーブルの値のバリデーションのテストがしたい

該当のソースコード

require 'test_helper' class TeacherTest < ActiveSupport::TestCase def setup @teacher = Teacher.new(name: "Example Teacher", programming_ids: 1) end test "should be valid" do assert @teacher.valid? end end
class Teacher < ApplicationRecord has_many :teachers_programmings, foreign_key: 'teacher_id', dependent: :destroy has_many :programmings, through: :teachers_programmings, dependent: :destroy accepts_nested_attributes_for :programmings validates :name, presence: true, length: { maximum: 16} ,uniqueness: true validates :teachers_programmings, presence: true end
class TeachersProgramming < ApplicationRecord belongs_to :teacher, optional: true belongs_to :programming, optional: true end

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

おそらく中間テーブルのバリデーションは成功しているが、setupでうまくprogramming_idを渡せていないため、setupでエラーが出てしまっている。

rails test TeacherTest#test_should_be_valid: ActiveRecord::RecordNotFound: Couldn't find Programming with 'id'=[1] test/models/teacher_test.rb:28:in `setup'

分からないところ

どのように記述したらsetupでエラーを出さないで済むか。rails consoleでTeacher.new(name: "Example Teacher",programming_ids: 1)をすると問題なくsaveできた。質問がわかりにくいかもしれませんが、どうか回答のほどよろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Programmingのエンティティが無いからエラーになっているのかと思います。また、1がハードコードされているのも良くないです。

validates :teachers_programmings, presence: true

テストコードの意図や前提条件がよくわかりませんが、こんな感じならvalidになるかなと思います。

@programming = Programming.create!(name: 'hogehoge') @teacher = Teacher.new(name: "Example Teacher", programming: @programming)

いづれにせよ、関係性のアノテーションが分かりづらいのでこのあたりを読んで理解を整理したほうが良いかもしれません。
https://railsguides.jp/association_basics.html#has-many-through%E3%81%A8has-and-belongs-to-many%E3%81%AE%E3%81%A9%E3%81%A1%E3%82%89%E3%82%92%E9%81%B8%E3%81%B6%E3%81%8B

投稿2020/01/21 12:21

編集2020/01/21 12:23
matsubokkuri

総合スコア744

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

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

KokiOya

2020/01/22 08:07

申し訳ございません。ITの勉強は始めたばかりでして、専門用語がわかりません。Railsガイドを読んでみます。ご回答ありがとうございました。
matsubokkuri

2020/01/22 08:12

カタカナが多くてすいませんでした。いづれにせよ、取りあえず動くコードにするのであれば、あと一歩のところです。惜しい所まで来ています。
guest

0

まず、中間tableで optional: true はおかしいです。
必ずあるべきものですから。それがnilなら中間tebleのレコードとして役に立たない。

Couldn't find Programming with 'id'=[1]
とありますから、まだProgramingが作られていないんですね。

とすると、予め作っておく、というのが1法、
同時に作るには
@teacher = Teacher.new(name: "Example Teacher") @teacher.programmings_build

投稿2020/01/03 12:25

winterboum

総合スコア23333

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

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

KokiOya

2020/01/04 01:32

NoMethodError: undefined method `programmings_build' for nil:NilClass というエラーが出てしまいました
winterboum

2020/01/04 02:11

@teacher をその前に作ってますか?
KokiOya

2020/01/21 09:28

諸事情で返信が遅くなってしまい申し訳ございません。エラーは出なくなりましたが、渡し方は programming_ids: 1で良いのでしょうか?
winterboum

2020/01/21 11:02

それだけでは、どのfileのどこにそう書くのか分からないので判断しようがないです。
KokiOya

2020/01/21 13:52

teacher_test.rbのsetupです
winterboum

2020/01/22 00:02

programming_ids というのは Teacherにはないfieldですね?エラーになります。 回答に書いた 「同時に作るには」の所を見てください
KokiOya

2020/01/22 08:10

どのようにすればteacher_test.rbのsetupでTeacherにProgrammingという中間テーブルの値を与えることができるのでしょうか。
winterboum

2020/01/22 08:28

ですから、回答に書いてあります
KokiOya

2020/01/22 08:36

NoMethodError: undefined method `programmings' for nil:NilClassと出てしまいます。理解が足らず本当に申し訳ございません、
winterboum

2020/01/22 08:40

@teacher = Teacher.new(name: "Example Teacher") をその前に実行してます?
KokiOya

2020/01/22 08:41

はい。しています。
KokiOya

2020/01/22 08:42

NoMethodError: undefined method `programmings_build' for #<Teacher:0x00007fb3dcd2ac70> Did you mean? programming_idsと出てきてしまいます
winterboum

2020/01/22 08:48

あ、typoだ programmings_build でなく programmings.build です ですが気になるエラーメッセージ。「Did you mean? programming_ids」 どこかに programming_ids って定義してますか? それおかしい
KokiOya

2020/01/22 09:23

定義はしていないのですが、、 test_should_be_valid#TeacherTest (2.15s) Expected false to be truthy. なエラーになりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問