簡體   English   中英

to_xml include在rails 3.0.6 ruby​​ 1.9.2中不起作用

[英]to_xml include doesn't work in rails 3.0.6 ruby 1.9.2

我已經將我的服務器更新為ruby 1.9.2並且這已停止工作(rails 3.0.6):

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

這是Rails的核心問題。 發生的事情是,當包含Instruments時,會添加一個instrument_id屬性。 然后,當序列化每個Instrument時,XmlSerializer類使用每個列的type屬性,根據Instrument類的定義確定該屬性的類型。 由於在類定義中不存在instrument_id屬性,因此返回一個nil對象,從Ruby 1.9開始,該對象沒有Rails所依賴的type屬性。

(我不認為你鏈接的線程中的補丁有效 - 但我在下面提供的補丁確實如此。)

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

  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 

我想如果你正在使用HABTM關聯,你應該有一個名為musicians_instruments的連接表,你必須包括嵌套的連接表。

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

請注意,include與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嵌套包含正常工作。

這是一個解決方法,為我做了訣竅。

我使用屬性調用將所有活動記錄對象轉換為哈希,這為我解決了問題

@musicians = @ musicians.map {| a | a.attributes}

@ musicians.to_xml

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM