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

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

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

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Q&A

解決済

1回答

3325閲覧

Railsで入力フォームからのデータを外部キーを持たせて保存する方法を教えてください。

koume

総合スコア458

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

0グッド

0クリップ

投稿2017/11/16 12:24

Rails5.1.3でWebアプリケーション制作の勉強をしています。CustomersテーブルとPointsテーブルがあるのですが
Pointsテーブルに入力フォームで入力したデータを保存する際に外部キー(customer_id)の値も入れたいのですが
どこにどのように記述したらいいのでしょうか?コードは以下になります。

points_controller.rb def create @point_form = Customer::PointForm.new @point_form.assign_attributes(params[:form]) if @point_form.save flash.notice = 'ポイントを登録しました。' redirect_to action: 'show' else flash.now.alert = '入力に誤りがあります。' render actionn: 'new' end end
point.rb (モデル) class Point < ActiveRecord::Base belongs_to :customer end
new.html.erb <% @title = 'ポイントの新規登録' %> <h1><%= @title %></h1> <div id="generic-form"> <%= form_for @point_form, as: 'form', url: :customer_point do |f| %> <%= render 'form', f: f %> <div class="buttons"> <%= f.submit '登録' %> <%= link_to 'キャンセル', :customer_root %> </div> <% end %> </div>
_form.html.erb <%= FormPresenter.new(f, self).notes %> <fieldset id="Point-fields"> <legend>ポイント情報(正確に入力してください。)</legend> <%= render 'point_fields', f: f, confirming: false %> </fieldset>
_point_fields.html.erb <%= f.fields_for :point, f.object.point do |ff| %> <%= markup do |m| p = confirming ? ConfirmingPointFormPresenter.new(ff, self) : PointFormPresenter.new(ff, self) p.with_options(required: true) do |q| m << q.1game_block(:1game, '1回目') m << q.2game_block(:2game, '2回目') m << q.3game_block(:3game, '3回目') m << q.4game_block(:4game, '4回目') m << q.5game_block(:5game, '5回目') end end %> <% end %>

createアクションに以下のように記述したらいいのでしょうか?

points_controller.rb def create @point_form = Customer::PointForm.new @point_form.assign_attributes(params[:form])   #①のコード  customer = Customer.find_by(id: current_customer.id) point = customer.build_point(customer_id: current_customer.id) point.save #②のコード  customer = Customer.find_by(id: current_customer.id) customer.point.update(customer_id: current_customer.id) if @point_form.save flash.notice = 'ポイントを登録しました。' redirect_to action: 'show' else flash.now.alert = '入力に誤りがあります。' render actionn: 'new' end end

①のコード、②のコードのどちらかのような感じでいいのでしょうか?
それとも別のコード(方法)があるのでしょうか?
どなたか教えていただけないでしょうか?宜しくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ruby

1@point_form.asign_attributes(customer_id: current_sustomer.id)

これでいいのでは?

なお、1、2でcustomer = Customer.find_by(id: current_customer.id)とやっていますが、customerとcurrent_customerは同じものですので不必要です。

1の問題点

ruby

1@point_form.assign_attributes(params[:form])

で出来たPointとは別のPointを作成しているのでおかしい

2の問題点

ruby

1customer = Customer.find_by(id: current_customer.id) 2customer.point.update(customer_id: current_customer.id)

ってやってるけど、customer.id = current_customer.idなんだから、2行目の意味はないです。customer.pointで拾えるpointのcustomer_idには既にcustomer.idが入っています。
やるなら、customer.point = @point_form.pointみたいな書き方です。

投稿2017/11/17 07:53

chelsy7110

総合スコア596

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

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

koume

2017/11/18 10:56

お礼が遅くなり大変申し訳ございませんでした。回答ありがとうございます。うまく行きました。 今後とも宜しくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問