Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在单个rest调用中创建rest复杂资源实例_Ruby On Rails_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails 在单个rest调用中创建rest复杂资源实例

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

我想使用rails通过单个rest调用创建复杂的rest对象实例。 在下面的示例中,当我使用参数散列调用new on Person时,控制器中出现错误

当看到ActiveSupport::HashWithInferenceTaccess而不是电话号码时,我收到一个意外类型的错误

从测试传递的哈希包含哈希对象数组,而控制器操作参数创建ActiveSupport::HashWithInferenceAccess对象

  • 有什么修正错误的建议吗
  • 有没有更简单的方法通过一个rest调用创建复杂的activerecord对象 ie型号:

    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