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

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

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

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

Ruby

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

Q&A

解決済

1回答

1293閲覧

配列で受け取った外部キーをDBに保存をしたい。UnknownAttributeError エラーを解決したい

youcan

総合スコア2

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2020/08/27 16:20

前提・実現したいこと

こんにちは。
Ruby on Railsで、Task管理アプリを作成しています。
新しいTaskを保存する際に、2種類の外部キーも含めて保存をしたいのですが、片方だけ取得することができません。
(具体的には、project_idは取得できるが、user_idが取得できない)
エラーは保存する際に起きています。
初学者な為、不足情報ありましたらご指摘いただけますと幸いです。
よろしくお願い致します。

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

ActiveModel::UnknownAttributeError in TasksController#create unknown attribute 'user_ids' for Task. Extracted source (around line #13): 12 def create 13 @task = @project.tasks.new(task_params) 14 if @task.save 15 redirect_to project_tasks_path(@project) 16 else 17 render :new 18 end 19 end Rails.root: /Users/○○○/project/cons_app Application Trace | Framework Trace | Full Trace app/controllers/tasks_controller.rb:13:in `create' Request Parameters: {"utf8"=>"✓", "authenticity_token"=>"e5COBFWH5xDEo+6haJQ4FiXO6+pPPpFCO5QzyeCkw/KHLVWSOjNloFokAMojaeV6qMo/FSjYa1fi7n7C90mhSA==", "task"=>{"title"=>"test", "description"=>"test", "start(1i)"=>"2019", "start(2i)"=>"1", "start(3i)"=>"1", "end(1i)"=>"2020", "end(2i)"=>"2", "end(3i)"=>"2", "taskId"=>"1", "user_ids"=>["10"]}, "commit"=>"Create Task", "project_id"=>"11"} Toggle session dump Toggle env dump Response Headers: None

該当のソースコード

ruby

1【controllers/tasks_controller.rb】 2 3class TasksController < ApplicationController 4 before_action :set_project, only: [:new, :create] 5 6 def index 7 @tasks = Task.all 8 end 9 10 def new 11 @task = Task.new 12 end 13 14 def create 15 @task = @project.tasks.new(task_params) 16 if @task.save 17 redirect_to project_tasks_path(@project) 18 else 19 render :new 20 end 21 end 22 23 private 24 def task_params 25 params.require(:task).permit(:title, :description, :taskId, :start, :end, user_ids:[]) 26 end 27 28 def set_project 29 @project = Project.find(params[:project_id]) 30 end 31end

ruby

1【views/tasks/new.html.erb】 2 3<select name="task[user_ids][]"> 4 <option value="">ユーザーを選んでください</option> 5 <% User.all.each do |user| %> 6 <option value=<%=user.id%>><%= user.name %></option> 7 <% end %> 8</select>

試したこと

エラーの内容の通り、Taskオブジェクトの中に'use_ids'が見つからないと言うことから
1)View内のフォームの、該当のname属性を
'user_ids'→'user_id'に修正
2)Controller内の、ストロングパラメータの記述を
'user_ids:[]'→'user_id:[]'に修正
結果user_id情報が取得できませんでした。

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

Rails 5.2.4.3
ruby 2.6.5p114

テーブル設計

user テーブル

ColumnTypeOptions
namestringnull: false
emailstringnull: false
passwordstringnull: false
occupationIdintegernull: false

Association

  • has_many :user_projects
  • has_many :projects, through: :user_projects
  • has_many :messages
  • has_many :tasks

project テーブル

ColumnTypeOptions
namestringnull: false
descriptiontextnull: false
postcodestringnull: false
prefectureIdintegernull: false
citystringnull: false
blockstringnull: false
buildingstring
startdatenull: false
enddatenull: false

Association

  • has_many :user_projects
  • has_many :users, through: :user_projects
  • has_many :messages
  • has_many :tasks

user_project テーブル

ColumnTypeOptions
userreferencesnull: false, foreign_key: true
projectreferencesnull: false, foreign_key: true

Association

  • belongs_to :user
  • belongs_to :project

messages テーブル

ColumnTypeOptions
contentstring
userreferencesnull: false, foreign_key: true
projectreferencesnull: false, foreign_key: true

Association

  • belongs_to :user
  • belongs_to :project

task テーブル

ColumnTypeOptions
titlestringnull: false
descriptiontextnull: false
taskIdintegernull: false
startdatenull: false
enddatenull: false
userreferencesnull: false, foreign_key: true
projectreferencesnull: false, foreign_key: true

Association

  • belongs_to :user
  • belongs_to :project

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

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

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

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

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

guest

回答1

0

ベストアンサー

Task:Userが多:1の関係ですので、Taskにあるのはuser_idと一つだけです。その場合は、単にuser_idでだけで受け取ります。今の書き方はhas_many等で複数関連付けになっている場合です。一つのみの関連付けであるなら、次のようにしてみてください。

ERB

1<select name="task[user_id]"> 2 <option value="">ユーザーを選んでください</option> 3 <% User.all.each do |user| %> 4 <option value=<%=user.id%>><%= user.name %></option> 5 <% end %> 6</select>
def task_params params.require(:task).permit(:title, :description, :taskId, :start, :end, :user_id) end

ただ、単純なselectで十分の場合は、自前でタグを書いていくのではなく、collection_select等のヘルパーメソッドを使うことをお勧めします。

投稿2020/08/27 22:20

raccy

総合スコア21735

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

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

youcan

2020/08/27 23:58

raccy様 朝早くにご返信ありがとうございます! 早速試したところ、無事にデータベースに保存することができました! 丸一日詰まっていたところでしたので大変助かりました。本当に感謝です。 どうもありがとうございました!m(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問