Ruby on rails TypeError(不能将nil转换为整数):

Ruby on rails TypeError(不能将nil转换为整数):,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-plugins,Ruby On Rails,Ruby On Rails 3,Ruby On Rails Plugins,我在rails 3中开发了一个插件,它为模型提供了一个文档存储库。在任何模型中,都可以附加任意数量的具有特定名称的文档。喜欢 class Person < ActiveRecord::Base attach_documents_as :job_documents attach_documents_as :personal_documents end 我试图调试它,但在进入控制器的create或update方法之前,它会生成错误 完整的错误日志为: Error duri

我在rails 3中开发了一个插件,它为模型提供了一个文档存储库。在任何模型中,都可以附加任意数量的具有特定名称的文档。喜欢

class Person < ActiveRecord::Base
   attach_documents_as :job_documents
   attach_documents_as :personal_documents
end
我试图调试它,但在进入控制器的create或update方法之前,它会生成错误

完整的错误日志为:

    Error during failsafe response: ActionView::Template::Error
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/whiny_nil.rb:48:in `method_missing'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.3/lib/action_dispatch/http/parameters.rb:10:in `parameters'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.3/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb:3:in `__home_likewise_open____________nazar_hussain__rvm_gems_ruby_______p__gems_actionpack_______lib_action_dispatch_middleware_templates_rescues_diagnostics_erb__205668074_102092250__741834326'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.3/lib/action_view/template.rb:135:in `block in render'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/notifications.rb:54:in `instrument'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.3/lib/action_view/template.rb:127:in `render'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.3/lib/action_view/render/rendering.rb:59:in `block in _render_template'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/notifications.rb:52:in `block in instrument'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/notifications.rb:52:in `instrument'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.3/lib/action_view/render/rendering.rb:56:in `_render_template'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.3/lib/action_view/render/rendering.rb:26:in `render'
nazar.hussain/osd/development/atlantis/vendor/plugins/active_scaffold/lib/extensions/action_view_rendering.rb:86:in `render_with_active_scaffold'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.3/lib/action_dispatch/middleware/show_exceptions.rb:88:in `rescue_action_locally'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.3/lib/action_dispatch/middleware/show_exceptions.rb:68:in `render_exception'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.3/lib/action_dispatch/middleware/show_exceptions.rb:59:in `rescue in call'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.3/lib/action_dispatch/middleware/show_exceptions.rb:46:in `call'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.3/lib/rails/rack/logger.rb:13:in `call'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/rack-1.2.1/lib/rack/runtime.rb:17:in `call'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/cache/strategy/local_cache.rb:72:in `call'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/rack-1.2.1/lib/rack/lock.rb:11:in `block in call'
      <internal:prelude>:10:in `synchronize'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/rack-1.2.1/lib/rack/lock.rb:11:in `call'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.3/lib/action_dispatch/middleware/static.rb:30:in `call'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.3/lib/rails/application.rb:168:in `call'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.3/lib/rails/application.rb:77:in `method_missing'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.3/lib/rails/rack/log_tailer.rb:14:in `call'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/rack-1.2.1/lib/rack/content_length.rb:13:in `call'
nazar.hussain/.rvm/gems/ruby-1.9.2-p0/gems/rack-1.2.1/lib/rack/handler/webrick.rb:52:in `service'
nazar.hussain/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service'
nazar.hussain/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run'
nazar.hussain/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread'
这是插件代码

module AttachDocumentsAs
  module Attacher

    def attach_documents_as(*attachment_as)
      @as           = nil
      @type_model   = 'AttachDocumentsAs::Models::AttachedDocumentsDefaultType'

      attachment_as = attachment_as.to_a.flatten.compact.map(&:to_sym)
      @as           = attachment_as.first

      if attachment_as.size > 1
        @type_model = attachment_as.second
      end

      class_inheritable_reader(@as)

      class_inheritable_reader(:atd_as)
      write_inheritable_attribute(:atd_as, @as)

      class_inheritable_reader(:atd_as_type)
      write_inheritable_attribute(:atd_as_type, @type_model)

      if @type_model.to_s.camelize.constantize.is_a?(Class)
        class_eval do
          has_many @as, :as => :attachable, :class_name=>"AttachDocumentsAs::Models::AttachedDocument"
          accepts_nested_attributes_for @as

          include AttachDocumentsAs::Attacher::Core
        end
      end

    rescue NameError
      puts "Model with name #{"#{@as}DocType".camelize.constantize} does not exits"
    end

  end
end

module AttachDocumentsAs
  module Attacher
    module Core

      def self.included(base)
        base.send :include, AttachDocumentsAs::Attacher::Core::InstanceMethods
        base.extend AttachDocumentsAs::Attacher::Core::ClassMethods
      end

      module InstanceMethods
        def build_documents(count=1)
          1.upto count do
            self.send(self.send(:atd_as)).build
          end
          docs = self.send(self.send(:atd_as))
          0.upto (count-1) do |i|
            docs[i].typeable = self.send(:atd_as_type).to_s.camelize.constantize.new
          end
        end
      end

      module ClassMethods
      end
    end
  end
end
最后是形式

<%= simple_form_for(@testing, :html => {:multipart => true}) do |f| %>
    <%= f.error_notification %>

    <div class="inputs">
      <%= f.input :title %>
    </div>

    <div class="inputs">
      <%= f.simple_fields_for :xdocs do |x| %>
          <% if x.object.new_record? %>
              <div class="inputs">
                <%= x.input :attachment, :as=>:file %>
                <%= x.input :title, :as=>:string %>
                <%= x.input :description, :as=>:text %>
                <%= x.input :type, :as=>:attachment_type %>
              </div>
          <% end %>
      <% end %>

    </div>

    <div class="actions">
      <%= f.button :submit %>
    </div>
<% end %>
{:multipart=>true})do | f |%>
:文件%>
:字符串%>
:文本%>
:附件\类型%>

这是由于附件插件造成的。我删除了插件,一切正常。如果我再次安装插件,同样的问题也会出现。所以很明显,附件_-fu产生了一些冲突。

您确定没有调用其中不存在的代码吗?你能给我们发控制器代码让我们更清楚吗?用代码更新了问题。不,我试了很多,但找不到导致问题的确切问题。后来改用回形针。
module AttachDocumentsAs
  module Attacher

    def attach_documents_as(*attachment_as)
      @as           = nil
      @type_model   = 'AttachDocumentsAs::Models::AttachedDocumentsDefaultType'

      attachment_as = attachment_as.to_a.flatten.compact.map(&:to_sym)
      @as           = attachment_as.first

      if attachment_as.size > 1
        @type_model = attachment_as.second
      end

      class_inheritable_reader(@as)

      class_inheritable_reader(:atd_as)
      write_inheritable_attribute(:atd_as, @as)

      class_inheritable_reader(:atd_as_type)
      write_inheritable_attribute(:atd_as_type, @type_model)

      if @type_model.to_s.camelize.constantize.is_a?(Class)
        class_eval do
          has_many @as, :as => :attachable, :class_name=>"AttachDocumentsAs::Models::AttachedDocument"
          accepts_nested_attributes_for @as

          include AttachDocumentsAs::Attacher::Core
        end
      end

    rescue NameError
      puts "Model with name #{"#{@as}DocType".camelize.constantize} does not exits"
    end

  end
end

module AttachDocumentsAs
  module Attacher
    module Core

      def self.included(base)
        base.send :include, AttachDocumentsAs::Attacher::Core::InstanceMethods
        base.extend AttachDocumentsAs::Attacher::Core::ClassMethods
      end

      module InstanceMethods
        def build_documents(count=1)
          1.upto count do
            self.send(self.send(:atd_as)).build
          end
          docs = self.send(self.send(:atd_as))
          0.upto (count-1) do |i|
            docs[i].typeable = self.send(:atd_as_type).to_s.camelize.constantize.new
          end
        end
      end

      module ClassMethods
      end
    end
  end
end
<%= simple_form_for(@testing, :html => {:multipart => true}) do |f| %>
    <%= f.error_notification %>

    <div class="inputs">
      <%= f.input :title %>
    </div>

    <div class="inputs">
      <%= f.simple_fields_for :xdocs do |x| %>
          <% if x.object.new_record? %>
              <div class="inputs">
                <%= x.input :attachment, :as=>:file %>
                <%= x.input :title, :as=>:string %>
                <%= x.input :description, :as=>:text %>
                <%= x.input :type, :as=>:attachment_type %>
              </div>
          <% end %>
      <% end %>

    </div>

    <div class="actions">
      <%= f.button :submit %>
    </div>
<% end %>