2011-04-14 79 views
1

我已經更新了我的服務器紅寶石1.9.2,這停止工作(軌3.0.6):to_xml包括在軌不起作用3.0.6紅寶石1.9.2

def index 
    @musicians = Musician.includes(:instruments) 
    render :xml => @musicians.to_xml(:include => :instruments) 
end 

,這些模型:

class Musician < ActiveRecord::Base 
    has_and_belongs_to_many :instruments 
end 

class Instrument < ActiveRecord::Base 
    has_and_belongs_to_many :musicians 
end 

我得到這個錯誤:

undefined method `type' for nil:NilClass 

框架跟蹤:

activesupport (3.0.6) lib/active_support/whiny_nil.rb:48:in `method_missing' 
activerecord (3.0.6) lib/active_record/serializers/xml_serializer.rb:230:in `compute_type' 
activemodel (3.0.6) lib/active_model/serializers/xml.rb:22:in `initialize' 
activemodel (3.0.6) lib/active_model/serializers/xml.rb:75:in `new' 
activemodel (3.0.6) lib/active_model/serializers/xml.rb:75:in `block in serializable_attributes' 

任何線索我做錯了什麼?

也許這是關係到:https://rails.lighthouseapp.com/projects/8994/tickets/4840-to_xml-doesnt-work-in-such-case-eventselecttitle-as-tto_xml

回答

4

這是Rails的核心問題。發生的事情是,當包含樂器時,instrument_id屬性正在增加。然後,當每個儀器被序列化時,XmlSerializer類根據Instrument類的定義確定該屬性的類型,使用每個列的type屬性。由於instrument_id屬性在類定義中不存在,所以返回一個零對象,從Ruby 1.9開始,它沒有type屬性,Rails依賴於該屬性。

(我不認爲你鏈接到作品線程補丁 - 但我在下面提供了確實的一個。)

有兩種方法來解決這個問題:

  1. 不要序列化instrument_id(好主意)。
    render :xml => @musicians.to_xml(:include => { :instruments => { :except => :instrument_id } })
  2. 或修補Rails核心(壞主意)。
    --- a/activerecord/lib/active_record/serializers/xml_serializer.rb 2011-04-20 15:01:10.000000000 -0700 
    +++ b/activerecord/lib/active_record/serializers/xml_serializer.rb  2011-04-20 15:00:42.000000000 -0700 
    @@ -226,8 +226,10 @@ 
    
        class Attribute < ActiveModel::Serializers::Xml::Serializer::Attribute #:nodoc: 
         def compute_type 
    +  Rails.logger.info("key: #{name}, hash: #{@serializable.class.columns_hash[name]}") 
         type = @serializable.class.serialized_attributes.has_key?(name) ? 
    -   super : @serializable.class.columns_hash[name].type 
    +   super : @serializable.class.columns_hash[name].nil? ? 
    +   NilClass : @serializable.class.columns_hash[name].type 
    
         case type 
         when :text
0

我想,如果你正在使用HABTM關聯中,你應該有一個連接表稱爲musicians_instruments你必須包含嵌套的爲好。

render :xml => @musicians.to_xml(:include => {:musicians_instruments =>{:include=>:instruments}}) 

請注意,包含與ActiveRecord關聯不同。

更新

如果您創建的連接表的模型,您可以has_and_belongs_to_many更改爲has_many :through,它的使用更頻繁,做同樣的。

#musician.rb 
has_many :musicians_instruments 
has_many :instruments, :through=>:musicians_instruments 

#instrument.rb 
has_many :musicians_instruments 
has_many :musicians, :through=>:musicians_instruments 

這一個應該適合嵌套包括to_xml

+0

我剛剛測試了這一點,它給了我一個不同的錯誤:「未定義的方法'宏」的零:NilClass」。我可以通過創建一個視圖來輕鬆解決這個問題,但我仍然想知道這裏出了什麼問題。感謝您的輸入! – 2011-04-14 11:41:10

+0

您寧可爲連接表創建模型,而不是視圖。你也可以試試':include => {:musicians_instruments =>:instruments}'。 – dombesz 2011-04-14 12:14:40

0

這裏是一個解決方法是奏效了我。

我轉換的所有活動記錄對象中的屬性調用哪個固定的問題,對我來說

@musicians = @ musicians.map {哈希| A | a.attributes}

@ musicians.to_xml