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

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

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

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

Ruby

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

Q&A

1回答

4721閲覧

外部キーに値を設定できない

awa

総合スコア34

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2019/02/01 15:06

したいこと

time_cardsテーブルとusersテーブルがあり、
time_card:userは対:1の関係です。
time_cardのフォームにuserを選択するセレクトボックスを設けて、
その値によってtime_cardのuser_idを登録しようとしています。
イメージ説明

ruby

1【view】 2<%= form_with model: @time_card, url: apply_update_url do |form| %> 3<%= form.text_field :business_outline %> 4<%= form.select :overtime_application_target, User.where(superior: true).where.not(id: current_user.id).collect{ |p| [ p.name, p ] } %> 5<%= form.submit "登録する", :class => "btn btn-primary" %> 6<% end %>

ruby

1【controller】 2def apply_update 3 @time_card = TimeCard.find(params[:time_card][:id]) 4 if @time_card.update_attributes!(time_card_params) 5 flash[:success] = "登録が完了しました。" 6 redirect_to controller: 'time_cards', action: 'show', user_id: current_user.id 7 else 8 render 'edit' 9 end 10 end

問題

ただこのコードだと、以下のエラーが表示されます。

ruby

1*** ActiveRecord::AssociationTypeMismatch Exception: User(#70031622812880) expected, got "#<User:0x00007f6305751a88>" which is an instance of String(#19701280)

自分で考えたこと

外部キーの値入力は、数字ではなくインスタンスを入れなければTypeMismatch Exceptionが吐かれると記事で見たので、セレクトボックスのvalueにインスタンスを設定しているのですが、結局TypeMismatch Exceptionが吐かれてしまっています。
原因はセレクトボックスのvalueに設定していることで、インスタンスではなく文字列として扱われてしまっているのかなと考えています。
ただその解決方法がわかりません。
ご教授いただけませんでしょうか、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

外部キーの値入力は、数字ではなくインスタンスを入れなければTypeMismatch Exceptionが吐かれると記事で見たので、セレクトボックスのvalueにインスタンスを設定しているのですが

インスタンスを直接入力させることは適切ではありません。overtime_application_target_id(かどうかはわかりませんが、ID値)の列へ数値を入力させるようにしてください。

投稿2019/02/02 00:35

maisumakun

総合スコア145121

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

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

awa

2019/02/05 16:05 編集

ご回答ありがとうございます。 ご指摘通り、セレクトボックスの各optionにレコードidを付与して、overtime_application_target_idにレコードidを投入しようとしました。 しかし、質問で記述したAssociationTypeMismatch Exceptionエラーが発生してしまいます。 外部キーにはカラム値ではなくインスタンスを入れないといけないのかなと考えているのですが、 数値を直接入力できるのでしょうか・・・? できるのでしたら、どうしたら外部キーに数値を入力して更新できる記述になるのでしょうか。 知識不足ですみません、よろしくおねがいいたします。
maisumakun

2019/02/05 22:21

数値を入れようとして出たAssociationTypeMismatch Exceptionについても、エラーをコピペしていただけますか?
awa

2019/02/09 03:51

このエラーが表示されました。 セレクトボックスが飛ばす値を2にしていて、それをそのまま登録しようとしています。 ``` ApplyingState(#70106957235960) expected, got "2" which is an instance of String(#5094940) ```
maisumakun

2019/02/09 06:31

アソシエーションに直接値を代入しようとしていませんか?id値の列に対して入力させてください。
awa

2019/02/11 01:28

セレクトボックスからidを飛ばして、コントローラー側でそのidからインスタンスを取得し、DBに登録する処理にすると保存できました。 ``` time_card.is_overtime_applying = ApplyingState.find(params[:time_cards]["#{time_card.id}"][:is_overtime_applying]) ``` やはり外部キーには、数値ではなくインスタンスでないと入れられないのでしょうか。
maisumakun

2019/02/11 02:07 編集

「(アソシエーションに直接ではなく)ID列に数値を入れる」方法であれば通るはずです。
maisumakun

2019/02/11 02:08

has_oneの場合は、相手のモデル側でセットの必要がある場合も考えられます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問