![](/img/trans.png)
[英]to_xml Doesn't Work on Objects Returned Through Rails ActiveRecord habtm Reference
[英]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
屬性。
(我不認為你鏈接的線程中的補丁有效 - 但我在下面提供的補丁確實如此。)
有兩種方法可以解決這個問題:
instrument_id
(好主意)。 render :xml => @musicians.to_xml( :include => { :instruments => { :except => :instrument_id } } )
--- 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.