Weird problem with json rendering of model of relationship in Rails 3.0.4

Hi,

I’ve got a relationship through a one_to_many :though relationship:

Controller:

class TodaysOrdersController < ApplicationController

respond_to :json

before_filter :require_user

authorize_resource :class => false

def create
@patient = Patient.find(params[:patient_id])
@todays_order_of_patient =
DailyOrder.create_or_find_todays_order_for_patient @patient
respond_with(@todays_order_of_patient, :location => nil, :include
=> :courses)
end
end

Model:

class DailyOrder < ActiveRecord::Base

Relationships

has_many :course_orders
has_many :courses, :through => :course_orders

has_many :patient_orders
has_one :patient, :through => :patient_orders

def self.create_or_find_todays_order_for_patient(patient)
if(!patient.todays_order)
daily_order = DailyOrder.create
PatientOrder.create(:patient => patient, :daily_order =>
daily_order, :order_for_date => Date.today)
daily_order
else
patient.todays_order
end
end

end

The rendering result of the controller response with something like
that:
{“marked_for_destruction”=>false, “changed_attributes”=>{},
“attributes”=> {“additional_information”=>"…", “id”=>“594369222”},
“readonly”=>false, “errors”=>{}, “previously_changed”=>{},
“destroyed”=>false, “attributes_cache”=>{}, “new_record”=>false}

But i want the “right"json output which looks like that:
{“additional_information”=>”…", “id”=>“594369222”}

Do you know whats wrong here?

In create controller you should put something like
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @model }
format.json {render :json => @model}
end
Also in you have to call it in the browser with .json in order to show
it in that format
if you just are callin normal it will never render out

Hi ,
I thing you are trying to get the @todays_order_of_patient object
including the child object @todays_order_of_patient.courses in
a nested json. If that is what you are trying to accomplish try this:

replace:
respond_with(@todays_order_of_patient, :location => nil, :include
=> :courses)
with this:
respond_with(@todays_order_of_patient.to_json( :include
=> :courses), :location => nil)

OR version 2 :

remove:
respond_to : json - on the top
and replace the controler respond with:

respond_to do |format|
format.html
format.json { render :json => @todays_order_of_patient
object.to_xml(:include => :courses) }
end

Hi LeonS,

When you use respond_with it’s render result is always in format HTML
unless you specify the contrary thing in your route. For example:

http://localhost:3000/today_orders/15 # This way you will render the
HTML

http://localhost:3000/today_orders/15.json # This way you will render
the JSON instead the HTML

If you want to set by default to render in JSON format, in your routes
you could configure it like this:

resources :today_orders, :defaults => {:action => “create”, :format =>
“json”}

Best,
Luis Galaviz