親子モデルをまとめて登録したい
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 635
前提・実現したいこと
accepts_nested_attributes_forを使って親子モデルを
まとめて登録したいと考えております。
model
question.rb (親モデル)
class Question < ApplicationRecord
...
has_many :answers
accepts_nested_attributes_for :answers
end
answer.rb(子モデル)
class Answer < ApplicationRecord
belongs_to :question
...
end
migrate
question.rb
class CreateQuestions < ActiveRecord::Migration[5.1]
def change
create_table :questions do |t|
t.integer :user_id
t.integer :answer_id
t.string :title, limit: 32, null: false
t.text :body, limit: 5000, null: false
t.date :expire_date
t.timestamps
end
end
end
answer.rb
class CreateAnswers < ActiveRecord::Migration[5.1]
def change
create_table :answers do |t|
t.integer :question_id
t.string :answer, limit: 250, null: false
t.boolean :other
t.timestamps
end
end
end
view
new.html
<h2>投票作成</h2>
<%= render 'form', question: @question %>
_form.html.erb
<%= form_for(question) do |f| %>
<div class="field">
<%= f.label :title %><br />
<%= f.text_field :title %>
</div>
<div class="field">
<%= f.label :body %><br />
<%= f.text_area :body %>
</div>
<%= f.fields_for :answers do |af| %>
<div class="field">
<%= af.label :answer %><br />
<%= af.text_field :answer %>
</div>
<%= af.hidden_field :other, value: "false" %>
<% end %>
<div class="field">
<%= f.label :expire_date %><br />
<%= f.date_field :expire_date %>
</div>
<%= f.hidden_field :user_id, value: current_user.id %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
controller
questions_controller.rb
...
def new
@question = Question.new
@question.answers.build
end
def create
@question = Question.new(question_params)
if @question.save
redirect_to @question, notice: "作成しました。"
else
render :new
end
end
# StrongParameters
def question_params
params.require(:question).permit(:user_id, :title, :body, :expire_date, answers_attributes: [:answer, :other])
end
...
解決したい問題
上記ソースによって登録処理を行うと
questionテーブルのanswer_idのみ値が反映されません。
その他のカラム(answerテーブル含む)は全て値が反映されます。
ご教授いただけると幸いです。
※question一つに対して、answerは複数登録できるように修正する予定ですがaccepts_nested_attributes_foを試験的に確認するためにanswerは一つにしております。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
has_many つまり question:answer が 1:他 であるならば
questionテーブルのanswer_idは不要であり、保存されない挙動が正常です
よってカラム( t.integer :answer_id
) を消しましょう
※)2つ目のanswerを作る時questionテーブルのanswer_idにどちらを困りますよね?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/07/13 22:01
ありがとうございました。