RTPnomad RTPnomad - 1 year ago 74
JSON Question

Rails 4 Not Updating Nested Attributes Via JSON

I've scoured related questions and still have a problem updating nested attributes in rails 4 through JSON returned from my AngularJS front-end.

Question: The code below outlines JSON passed from AngularJS to the Candidate model in my Rails4 app. The Candidate model has many Works, and I'm trying to update the Works model through the Candidate model. For some reason the Works model fails to update, and I'm hoping someone can point out what I'm missing. Thanks for your help.

Here's the json in the AngularJS front-end for the candidate:

{"id"=>"13", "nickname"=>"New Candidate", "works_attributes"=>[
{"title"=>"Financial Analyst", "description"=>"I did things"},
{"title"=>"Accountant", "description"=>"I did more things"}]}

Rails then translates this JSON into the following by adding the candidate header, but does not include the nested attributes under the candidate header and fails to update the works_attributes through the candidate model:

{"id"=>"13", "nickname"=>"New Candidate", "works_attributes"=>[
{"title"=>"Financial Analyst", "description"=>"I did things"},
{"title"=>"Accountant", "description"=>"I did more things"}],
"candidate"=>{"id"=>"13", "nickname"=>"New Candidate"}}

The candidate_controller.rb contains a simple update:

class CandidatesController < ApplicationController

before_filter :authenticate_user!

respond_to :json

def update
respond_with Candidate.update(params[:id], candidate_params)


def candidate_params
works_attributes: [:id, :title, :description])


The candidate.rb model includes the following code defining the has_many relationship with the works model:

class Candidate < ActiveRecord::Base

## Model Relationships
belongs_to :users
has_many :works, :dependent => :destroy

## Nested model attributes
accepts_nested_attributes_for :works, allow_destroy: true

## Validations
validates_presence_of :nickname
validates_uniqueness_of :user_id


And finally, the works.rb model defines the other side of the has_many relationship:

class Work < ActiveRecord::Base
belongs_to :candidate

I appreciate any help you may be able to provide as I'm sure that I'm missing something rather simple.


Answer Source

I've also been working with a JSON API between Rails and AngularJS. I used the same solution as RTPnomad, but found a way to not have to hardcode the include attributes:

class CandidatesController < ApplicationController
  respond_to :json

  nested_attributes_names = Candidate.nested_attributes_options.keys.map do |key| 

  wrap_parameters include: Candidate.attributes_names + nested_attributes_names,
    format: :json

  # ...

Refer to this issue in Rails to see if/when they fix this problem.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download