Fir3Chi3f
Fir3Chi3f

Reputation: 113

Can't get my strong parameters nested correct in Ruby on Rails

I'm trying to add an array of objects (tasks in this case) as a return type in my controller for the root object (project). One project has many tasks and I'd like to save it all at once, but I keep getting the following error indicating that the return type isn't correct.

ActiveRecord::AssociationTypeMismatch (Task(#47457277775360) expected, got {"name"=>"Some task", "start"=>"2019-12-05T03:38:48.555Z", "end"=>"2019-12-14T03:38:48.555Z"} which is an instance of ActiveSupport::HashWithIndifferentAccess(#47457266882220))

The whitelisted parameters I have are like this

# whitelist params
params.permit(:name, :description, tasks: [:name, :start, :end])

The data being returned for the above example:

{"name"=>"asdf", "description"=>"zxvccxvzzxcvxcvcxvzxcvz", "tasks"=>[{"start"=>"2019-12-05T03:38:48.555Z", "end"=>"2019-12-14T03:38:48.555Z", "name"=>"Some task"}]}

[Edit] - Here are the models we're working with

# app/models/task.rb
class Task < ApplicationRecord
  # model association
  belongs_to :project

  # validation
  validates_presence_of :name
end
# app/models/project.rb
class Project < ApplicationRecord
  # model association
  has_many :tasks, dependent: :destroy
  accepts_nested_attributes_for :tasks

  # validations
  validates_presence_of :name
end

Upvotes: 0

Views: 345

Answers (1)

Pardeep Saini
Pardeep Saini

Reputation: 2102

As per rails documentation Nested attributes allow you to save attributes on associated records through the parent. So in your strong params you need to pass attributes like this.

params.permit(:name, :description, task_attributes: [:name, :start, :end])

I suggest you to bind all params under one attribute like this

params.require(:project).permit(:name, :description, task_attributes: [:name, :start, :end])

so you must send params from frontend like

{"project": {"name"=>"asdf", "description"=>"zxvccxvzzxcvxcvcxvzxcvz", "task_attributes"=>[{"start"=>"2019-12-05T03:38:48.555Z", "end"=>"2019-12-14T03:38:48.555Z", "name"=>"Some task"}]}}

You can read the documentation from https://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

Upvotes: 1

Related Questions