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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

2209閲覧

親子関係のモデルへform_forを使ってのデータ保存について

doit24

総合スコア13

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/08/18 04:20

###前提・実現したいこと
Ruby on Rails でサービスを構築しています。

has_one:belongs_toを使って、1対1の親子関係のデータを保存したいと思っています。

すでに2日間くらい手こずっていて、詰まってしまい心が折れそうになっています。
アドバイスいただけないでしょうか。

よろしくお願いします。

###発生している問題・エラーメッセージ

エラーメッセージ [ Unpermitted parameters: teacher_schedule ] とterminalで表示されてしまい、teacher_schedule以下にpermitしている内容が、DBにもデータが保存されていないようです。

###該当のソースコード

teachers_contoller.rb

1class Teacher::TeachersController < Teacher::ApplicationController 2 def show 3 @teacher = current_teacher 4 end 5 6 def edit 7 @teacher = current_teacher 8 @teacher_schedule = current_teacher_schedule 9 @teacher.build_teacher_schedule 10 end 11 12 def update 13 @teacher = current_teacher 14 if @teacher.update(teacher_params) 15 redirect_to teacher_teacher_path 16 else 17 render :edit 18 end 19 end 20 21 private 22 23 def current_teacher 24 Teacher.find(params[:id]) 25 end 26 27 def current_teacher_schedule 28 TeacherSchedule.find(params[:id]) 29 end 30 31 def teacher_params 32 params.require(:teacher).permit(:id, :first_name, :last_name, :image, :image_cache, :prefecture, :nationality, :age, :sex, :mother_language, :experience, :japanese_level, :japan_duration, :qualification, :education, :education_major, :education_name, :profession, :industry, :message, teacher_schedule_attributes: [:id, :monday1, :monday2, :monday3, :monday4, :tuesday1, :tuesday2, :tuesday3, :tuesday4, :wednesday1, :wednesday2, :wednesday3, :wednesday4, :thursday1, :thursday2, :thursday3, :thursday4, :friday1, :friday2, :friday3, :friday4, :saturday1, :saturday2, :saturday3, :saturday4, :sunday1, :sunday2, :sunday3, :sunday4, :memo]) 33 end 34end

teacher_schedule.rb

1class TeacherSchedule < ApplicationRecord 2 belongs_to :teacher 3 4 enum availability: { 5 OK: 0, 6 NG: 1 7 } 8end

teacher.rb

1class Teacher < ApplicationRecord 2 has_many :orders 3 has_many :users, through: :orders 4 has_one :teacher_schedule 5 accepts_nested_attributes_for :teacher_schedule, allow_destroy: true 6 7 devise :database_authenticatable, :registerable, 8 :recoverable, :rememberable, :trackable, :validatable 9 10 mount_uploader :image, ImageUploader 11end

edit.html.erb

1 <h1>Register your profile</h1> 2 3<%= form_for [:teacher, @teacher] do |f| %> 4<%= f.hidden_field :id %> 5<h2>About yourself</h2> 6 7<div class="row"> 8 <div class="col-lg-6"> 9 <%= f.label :first_name ,class: 'form_control'%> 10 <%= f.text_field :first_name, placeholder: "First Name", class: "form-control" %> 11 </div> 12 <div class="col-lg-6"> 13 <%= f.label :last_name ,class: 'form_control'%> 14 <%= f.text_field :last_name, placeholder: "Last Name", class: "form-control" %> 15 </div> 16</div> 17 <div class="form-group file"> 18 <%= f.label :image ,class: 'form_control'%><br> 19 <%= f.file_field :image, class: "form-control floating-label", placeholder: "画像アップロード" %> 20 </div> 21 22 <div class="col-lg-12"> 23 <%= f.label :prefecture ,class: 'form_control'%> 24 <%= f.select :prefecture, Teacher.prefectures.keys, placeholder: "Prefecture i.e.:Tokyo", class: "form-control" %> 25 </div> 26 27 <div class="col-lg-12"> 28 <%= f.label :nationality ,class: 'form_control'%> 29 <%= f.select :nationality, Teacher.nationalities, placeholder: "Nationality", class: "form-control" %> 30 </div> 31 32==== 似たような項目の入力欄が続く ===== 33 34 <%= f.fields_for [:teacher_schedule, @teacher_schedule] do |ts| %> 35 <%= ts.hidden_field :id %> 36 <div class="row"> 37 <div class="col-lg-4"> 38 <p class="text-center">Monday</p> 39 </div> 40 41 <div class="col-lg-2"> 42 <%= ts.label :Morning ,class: 'form_control'%> 43 <%= ts.select :monday1, TeacherSchedule.availabilities.keys, placeholder: "Monday", class: "form-control" %> 44 </div> 45 46 <div class="col-lg-2"> 47 <%= ts.label :Lunch_Time ,class: 'form_control'%> 48 <%= ts.select :monday2, TeacherSchedule.availabilities.keys, placeholder: "Monday", class: "form-control" %> 49 </div> 50 51 52==== 似たような項目の入力欄が続く ===== 53 54 <% end %> 55 <div class="form-group"> 56 <%= f.submit "送信", class: "btn btn-primary withripple" %> 57 </div> 58<% end %> 59 60

###試したこと
teachers_controllerのstrong parameteのところを teacher_schedule_attributes -> teacher_scheduleにすると [unpermited parameters] のエラーは表示されないのですが、

ActiveRecord::AssociationTypeMismatch in Teacher::TeachersController#update

というメッセージを受け取りエラーになってしまいます。

###補足情報(言語/FW/ツール等のバージョンなど)

ruby 2.4.0p0
Rails 5.0.5

詰まってしまって、辛い気持ちです。もしよろしければ助けていただけないでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

フォームの

<%= f.fields_for [:teacher_schedule, @teacher_schedule] do |ts| %>

これが原因です。

<%= f.fields_for :teacher_schedule do |ts| %>

です。フォームのソースとかログとか見てみるとstrong parametersで指定したフィールド名と合ってないのがわかると思います。


上記を直したら参照されなくなるので実際の動作には影響ないのですが

def current_teacher_schedule TeacherSchedule.find(params[:id]) end

TeacherのidとTeacherScheduleのidは一致するとは限りません。params[:id]で来るのはTeacherのidですので、TeacherScheduleをこれで検索してるのはバグです。

投稿2017/08/18 04:51

suzukis

総合スコア1449

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

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

doit24

2017/08/18 05:44

ありがとうございました!色々と試行錯誤したせいで、不要なコードがいくつか他にも混じっていました。大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問