Ruby on rails 在单个rest调用中创建rest复杂资源实例
我想使用rails通过单个rest调用创建复杂的rest对象实例。 在下面的示例中,当我使用参数散列调用new on Person时,控制器中出现错误 当看到ActiveSupport::HashWithInferenceTaccess而不是电话号码时,我收到一个意外类型的错误 从测试传递的哈希包含哈希对象数组,而控制器操作参数创建ActiveSupport::HashWithInferenceAccess对象Ruby on rails 在单个rest调用中创建rest复杂资源实例,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我想使用rails通过单个rest调用创建复杂的rest对象实例。 在下面的示例中,当我使用参数散列调用new on Person时,控制器中出现错误 当看到ActiveSupport::HashWithInferenceTaccess而不是电话号码时,我收到一个意外类型的错误 从测试传递的哈希包含哈希对象数组,而控制器操作参数创建ActiveSupport::HashWithInferenceAccess对象 有什么修正错误的建议吗 有没有更简单的方法通过一个rest调用创建复杂的active
class Person < ActiveRecord::Base
has_many :phone_numbers , :autosave => true
class PhoneNumber < ActiveRecord::Base
belongs_to :person
链接:
链接:迪纳提赫,谢谢你的回答!它帮助解决了这个问题 我遇到了一个小问题,因为“接受\u嵌套的\u属性\u用于:电话号码”, 需要散列键“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
迪纳提赫,谢谢你的回答!它帮助解决了这个问题 我遇到了一个小问题,因为“接受\u嵌套的\u属性\u用于:电话号码”, 需要散列键“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
您还应查看:
- Gem嵌套表格:
- 嵌套形式的示例:
- 铁路乘客196/197
- Gem嵌套表格:
- 嵌套形式的示例:
- 铁路乘客196/197
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
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
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