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

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

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

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

Q&A

解決済

2回答

1240閲覧

accepts_nested_attributes_for のキー名を変更する方法

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

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

0グッド

0クリップ

投稿2020/06/24 05:56

編集2020/06/24 07:03

HTML フォームではなくAPIからとんでくるパラメータ仕様がきまっているので
xxx_attributes ではないキーのサブハッシュをサブテーブルに自動保存することはできないでしょうか

main: { name: 'abc', sub: { val: 123 } }

のように params に入っているときに
main と has_one 関係にある sub モデルを自動保存したいです

sub_attibutes になってれば accepts_nested_attributes_for で1発だと思うんですが…


accepts_nested_attributes_for をあきらめて手動で保存しようと

class Main < ApplicationRecord has_one :sub def sub=(val) self.sub = Sub.new val self.sub.main = self self.sub.save end end

とかいたところレコードは作成されたんですが
FK が NULL になってしまってうまくいきません

親が保存される前に子テーブルを保存してしまってるので FK が決定できないせいかと思うのですが
こういう場合どうすればいいかお知恵をお貸しいただけないでしょうか

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

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

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

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

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

guest

回答2

0

ポイントはMainクラスのインスタンスに対して、subを作成してあげて、Mainクラスのインスタンスで保存してあげることです。

あまりコントローラにモデル依存のロジックをかくべきではないかなと思ったのでモデル側にかいたんですが。。。

質問の意図がしっかり把握できなかったのは申し訳なかったです。

下記のような感じでどうでしょうか。ストロングパラメーターは自信ないです。

Controller

Ruby

1main = Main.new main_params 2main.save 3 4# ストロングパラメーター 5def main_params 6 params.require(:main).permit(:name, sub: [:val]) 7end

Model

Ruby

1def sub=(attr={}) 2 self.build_sub(attr) 3end

投稿2020/06/24 09:27

Cojiro

総合スコア539

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

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

退会済みユーザー

退会済みユーザー

2020/06/24 10:01 編集

> 質問の意図がしっかり把握できなかったのは申し訳なかったです こちらが何も書いてなかったのでぜんぜんそんなことはないです ただ Rails の書き方的にモデルに依存したロジックをコントローラにかくべきではないみたいな一般的なしきたりみたいなのがあるみたいなので、無理にモデルにかこうとしてしまってはまりました。 コントローラにかいたほうがわかりやすそうなのでせっかく別解教えていただいたんですが、コードを戻してまたはまるのも怖いのでコントローラにかくほうで進めたいと思います
guest

0

ベストアンサー

URLとメソッド, コントローラーの処理、パラメーターの中身を載せて欲しいですが、
推測するに下記のような感じでできるのではないでしょうか。(Mainクラスのsub=はこのケースだといらないと思います。)

Ruby

1main = Main.new(main_params) 2main.build_sub(sub_params) 3main.save 4 5 6# ストロングパラメーター 7def main_params 8 params.require(:main).permit(:name) 9end 10 11def sub_params 12 params.require(:main).require(:sub).permit(:val) 13end

動作未検証なのでお試しいただく形になるかと思いますが、
参考になればと嬉しいです。

投稿2020/06/24 08:15

編集2020/06/24 08:16
Cojiro

総合スコア539

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

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

退会済みユーザー

退会済みユーザー

2020/06/24 08:33

うーん… やってることは同じ気がするんですがおっしゃる方法だとうまくいきました。あまりコントローラにモデル依存のロジックをかくべきではないかなと思ったのでモデル側にかいたんですが。。。 とりあえず動いたので使わせていただきます! ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問