to_xml include在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的核心问题。发生的情况是,当包含乐器时,将添加一个“ 4”属性。然后,在序列化每个Instrument时,XmlSerializer类使用每个列的type属性,根据Instrument类的定义来确定该属性的类型。由于类定义中不存在
instrument_id
属性,因此返回一个nil对象,从Ruby 1.9开始,该对象没有Rails依赖的
type
属性。 (我认为您链接到的线程中的补丁不起作用,但是我在下面提供的补丁起作用了。) 有两种方法可以解决此问题: 不要序列化
instrument_id
(好主意)。
render :xml => @musicians.to_xml( :include => { :instruments => { :except => :instrument_id } } )
或修补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}} )
请注意,包含与“ 13”关联中的不同。 更新资料 如果为联接表创建模型,则可以将
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
此选项应与嵌套的ѭ17includes一起正常使用。     
这是一种解决方法,可以帮到我。 我使用属性调用将所有活动记录对象转换为哈希,这为我解决了该问题 @musicians = @ musicians.map {| a | a.attributes} @ musicians.to_xml     

要回复问题请先登录注册