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

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

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

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

Ruby

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

Ruby on Rails

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

Q&A

解決済

2回答

1298閲覧

登録確認画面で中間テーブルの値 (place_ids)を使いたい

KokiOya

総合スコア27

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2019/07/20 06:20

編集2019/08/02 09:54

rails初心者です。Teacher登録確認画面を作っています。確認画面の時にhidden_fieldを用いているのですが、place_idsなどの中間テーブルを使った値が使えず、 validates :place_ids, presence: trueに引っかかり、Teacherを保存することができません。どのようにすればよろしいでしょうか。

確認画面のconfirm.html.erbです

<%= form_for(@teacher) do |f| %> <div class="field"> <%= f.fields_for :places do |place_f| %> <%= f.label :"指導場所" %> <%= place_f.hidden_field :id %> <p><%= place_f.object.name %></p> <% end %> </div> <%= f.submit '投稿画面に戻る', name: 'back' %> <%= f.submit '投稿する' %> <% end %>

登録画面のnew.html.erbです

<%= form_for(@teacher, url: {action: 'confirm'} ) do |f| %> <div class ="field"> <%= f.label :"指導場所" %> <%= f.collection_check_boxes :place_ids, @place, :id, :name ,{include_hidden: false},{multiple: true} %> </div> <%= f.submit "確認画面へ" %> <% end %>

teacher.rbです

class Teacher < ApplicationRecord has_many :teachers_places, foreign_key: 'teacher_id', dependent: :destroy has_many :places, through: :teachers_places, dependent: :destroy accepts_nested_attributes_for :places validates :place_ids, presence: true end

teacher_controller.rbのnewアクションとconrilmアクションとcreateアクションとStrong Parametersです

class TeachersController < ApplicationController def new @teacher = Teacher.new @place = Place.all @teacher.teachers_places.build end def confirm @place = Place.all @teacher = Teacher.new(teacher_params) if @teacher.valid? render 'confirm' else render 'new' end end def create @place = Place.all @teacher = Teacher.new(teacher_params) @teacher.place_ids = params[:teacher][:places_attributes] if params[:back] render 'new' elsif @teacher.save redirect_to teachers_url else render 'new' end end private def teacher_params params.require(:teacher).permit(places_attributes: [:id], place_ids:[]) end end

アクションに渡っているparamsの内容
confirm

"teacher"=>{"place_ids"=>["3", "4"]}

create

"teacher"=>{"places_attributes"=>{"0"=>{"id"=>"3"}, "1"=>{"id"=>"4"}}}

rails cでのplack(:id)の結果

irb(main):003:0> Place.pluck(:id) (0.4ms) SELECT "places"."id" FROM "places" => [1, 2, 3, 4]

質問がわかりにくく申し訳ありません。ご回答のほどよろしくお願いします。

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

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

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

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

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

guest

回答2

0

自己解決

解決いたしました。下にありますようにsessionにplace_idsを入れたら成功いたしました。

def confirm session[:place_ids] = @teacher.place_ids if @teacher.valid? render 'confirm' else render 'new' end end def create @place = Place.all @teacher.place_ids = session[:place_ids] if params[:back] render 'new' elsif @teacher.save redirect_to teachers_url else render 'new' end end

長い間お付き合いいただきましたwinterboum様、本当にありがとうございました。

投稿2019/08/08 13:59

KokiOya

総合スコア27

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

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

0

綺麗な書き方があるのでは、、と控えて居ましたがなかなか回答が無いようですので、美しさ・簡明さには目をつぶって下さい。

<%= f.hidden_field :place_ids %> <% @teacher.places.each do |place| %> <p><%= place.name %></p> <% end %>

<%= f.fields_for :places do |place_f|%> <%= place_f.hidden_field :id %> <p><%= place_f.object.name %></p> <% end %>

とすると
params[:teacher][:places_attributes] に id が入ってくるかと。

Teacher modelでaccepts_nested_attributes_for の定義が必要です

#追記
設問を読み違えてました、すみません。validationがうまく行かないんですね。
validates :place_ids, presence: true
この書き方は初めてみました。有るのかな。。
validates :teachers_places, presence: true
としてみるとどうでしょう

投稿2019/07/22 12:33

編集2019/08/01 12:49
winterboum

総合スコア23329

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

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

KokiOya

2019/07/25 06:22

ご解答ありがとうございます。返信が遅くなってしまい申し訳ありません。その方法で試そうと思ったのですが、<p><%= place_f.object.name %></p>の部分でNameErrorが出てしまいます。どうすればよろしいでしょうか
winterboum

2019/07/25 07:22

どの行で、どの識別子が NameErrorですか? 念のため モデル Placeの migrationかdb/schemaも見せて下さい
KokiOya

2019/08/01 00:51 編集

私用で返信が遅くなってしまい本当に申し訳ありません。NameErrorは久しぶりに開いたところ治っていたのですが、params[:teacher][:places_attributes]の値をcreateアクションで @teacher.place_ids = params[:teacher][:places_attributes] としてとると Couldn't find Place with ID=3 for Teacher with ID=というerrorが帰ってくるのですがどのようにすればよろしいでしょうか。 Strong Parametersはparams.require(:teacher).permit( places_attributes: [:id])としております。 返信が遅くなってしまいましたこと、誠に申し訳ありませんでした。可能でしたらご回答のほどよろしくお願いします。
winterboum

2019/08/01 03:19

連日の暑さで焼き味噌状態なので、頭の中で組み立てられない、、ので。 以下下さい そのエラーのでる 1) アクションに渡っているparamsの内容。logにあります。 2)アクションの最新のソース 3)そのアクションを呼ぶView コメントへではなく、質問本文に<code>でおねがいします
KokiOya

2019/08/01 10:52

私も最近の暑さで軽い熱中症を起こしてしまいました、、体調のほどお気をつけください。更新しましたのでご確認のほどよろしくお願いします。
winterboum

2019/08/01 12:10 編集

省略されてしまうと、残りは推定で、となってしまうのでよくないです。 paramsは "teacher" => から下さい あと回答の一番下に Teacher modelでaccepts_nested_attributes_for の定義が必要です としましたが、teacher.rb には無いようです。 それをつけた状態で流してみてください。
KokiOya

2019/08/01 12:20

accepts_nested_attirubutes_for の定義は行なっていましたが、質問のteacher.rbの変更を更新するのを忘れていました。paramsも更新いたしました。ご確認ください。
KokiOya

2019/08/01 13:24 編集

validationはうまくいっているはずなのですが、試してみます。質問としては登録の確認画面を作りたいのですが、中間テーブルの値の扱い方がわからず、hidden_tableを使ってみたところteacher.place_idsに値が入らずvalidationに引っかかってしまいます。良い方法があればご回答のほどよろしくお願いします。
winterboum

2019/08/01 13:31 編集

create の params みると、placeのIDが渡ってますね。 teacher_params 見せて下さい (今日はねます。 teacher_params が正しければ、以下の1行削除で行くと思います。 @teacher.place_ids = params[:teacher][:places_attributes]
KokiOya

2019/08/01 13:39 編集

teacher_paramsは以下のようになっております。 def teacher_params params.require(:teacher).permit(places_attributes: [:id], place_ids:[]) end 夜遅くまでお付き合いいただきありがとうございます。ごゆっくりお休みください。
winterboum

2019/08/01 21:14

@teacher.place_ids = params[:teacher][:places_attributes] を削除してみてください
KokiOya

2019/08/02 04:59

削除しましたが、全く同じerrorが出ました。[ Couldn't find Place with ID=4 for Teacher with ID= ]
winterboum

2019/08/02 06:02

とするとvalidation以前の話ですね。 class TeachersController に def new も追加 rails c にて, Plase.pluck(:id) した結果 を載せて下さい
KokiOya

2019/08/02 08:06

更新いたしましたので、ご確認ください。
winterboum

2019/08/02 08:30

pluck[:id] でなく 丸括弧 (:id)です。 それとあの def new ではエラーになりませんか? @teacher.teachers_places.build のとkろで、Nil には teachers_places methodがない、と
KokiOya

2019/08/06 10:05 編集

申し訳ございません。訂正しましたのでご確認ください。def new は@teacher = Teacher.newが抜けておりました。こちらも訂正いたしましたのでご確認ください。
KokiOya

2019/08/08 13:02

ご回答を急かすわけではないのですが、もしかすると私の返信にお気づきになられていないのかと思いましたので、追加のコメントをさしていただきました。こちらも返信が遅れたこともありながら申し訳ありません。
winterboum

2019/08/08 13:08

訂正したあと、どういう動きになりました?
KokiOya

2019/08/08 13:56

長い間ご回答し続けてくださりありがとうございました。sessionで値を渡したところうまくいきましたことをご報告させていただきます。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問