Создать экземпляр ресурса комплекса отдыха за один вызов rest - PullRequest
1 голос
/ 08 июля 2011

Я хотел бы создать сложные экземпляры объекта отдыха с помощью одного вызова rest с использованием rails.В приведенном ниже примере я получаю сообщение об ошибке в контроллере при вызове new для Person с хешем параметра.

Я получаю сообщение об ошибке неожиданного типа при просмотре ActiveSupport :: HashWithIndifferentAccess, а не PhoneNumber

Хэш, переданный из теста, содержит массив объектов Hash, а параметры действия контроллера создают объекты ActiveSupport :: HashWithIndifferentAccess.

  1. Есть предложения по исправлению ошибки?
  2. Существует ли более простой способ создания сложных объектов activerecord с помощью одного вызова rest.

т.е. модели:

class Person < ActiveRecord::Base  
  has_many :phone_numbers , :autosave => true  

class PhoneNumber  < ActiveRecord::Base  
  belongs_to :person  

person_controller_test.rb

test "should create person" do
  newperson=Person.new(:name => "test")
  newperson.phone_numbers << PhoneNumber.new(:number => "123-4567")
  person_string= newperson.to_xml(:include => :phone_numbers)
  person_hash=Hash.from_xml(course_string)
  person_hash2=person_hash['person']
  post :create, :person => person_hash2, :format => "xml"
  assert_response :success
end  

person_controller.rb

def create  
  @person = Person.new(params[:person])

Ответы [ 3 ]

1 голос
/ 08 июля 2011
class Person < ActiveRecord::Base  
  has_many :phone_numbers , :autosave => true
  # this is important for create complex nested object in one call
  accepts_nested_attributes_for :phone_numbers
end

class PhoneNumber  < ActiveRecord::Base  
  belongs_to :person
end

person_controller_test.rb

test "should create person" do
  newperson=Person.new(:name => "test")
  newperson.phone_numbers.build(:number => "123-4567") #more cleaner
  # and start from here I'm not sure but this maybe help you
  # I think that you must pass a json object 
  post :create, :person => newperson.to_json(:include => :phone_numbers), :format => "xml"
  assert_response :success
end  

ссылка: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

0 голосов
/ 08 июля 2011
0 голосов
/ 08 июля 2011

Динатих, спасибо за полезный ответ!Это помогло решить проблему.

Я столкнулся с небольшой проблемой, так как с "accepts_nested_attributes_for: phone_numbers" требуется хеш-ключ "phone_numbers_attributes" вместо значения по умолчанию для сериализации to_xml / to_json для "phone_numbers".Тестовый код (ниже) выглядит немного некрасиво, но он проходит и правильно создает объект.Также передача json методу post, к сожалению, не создает объект.

test "should create complex person" do
  newperson=Person.new(:name => "test")
  newperson.phone_numbers.build(:number => "123-4567")
  person_string= newperson.to_xml(:include => :phone_numbers)
  person_hash=Hash.from_xml(person_string)
  person_hash2=person_hash['person']
  person_hash2[:phone_numbers_attributes] = person_hash2['phone_numbers']
  person_hash2.delete('phone_numbers')
  p person_hash2
  post :create, :person => person_hash2, :format => "xml"
  p response.body
  assert_select "person" do
    assert_select "name", {:text=>"test"}
    assert_select "phone-numbers" do
      assert_select "phone-number" do
        assert_select "number", {:text=>"123-4567"}
      end
    end
  end
  assert_response :success
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...