J'ai développé un plugin dans les rails 3, qui héberge un référentiel de documents pour les modèles. Dans n'importe quel modèle, vous pouvez joindre n'importe quel nombre de documents avec des noms spécifiques. Comme.TypeError (ne peut pas convertir nil en Integer):
class Person < ActiveRecord::Base
attach_documents_as :job_documents
attach_documents_as :personal_documents
end
Cela fonctionnait très bien. Je sais que ça a l'air stupide, mais aujourd'hui, j'ai commencé mon projet et je l'ai trouvé mort. Je n'arrive pas à comprendre pourquoi cela arrive. J'ai beaucoup essayé de comprendre, mais pas de chance. Les nouveaux formulaires et les mises à jour s'affichent bien, mais chaque fois que nous créons ou mettons à jour, cela génère une erreur.
Il donne une erreur majeure:
TypeError (can't convert nil into Integer):
J'ai essayé de le déboguer, mais il génère l'erreur avant d'entrer dans la méthode mise à jour ou créer du contrôleur.
et erreur complète journal est:
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'
espoir quelqu'un se penchera dans la question. Je serai remercié complet.
comme demandé je suis annonce le code:
Controller est simple échafaudage: avec une ligne supplémentaire. @testing.build_documents
en créer et modifier
ici est le modèle
class Testing < ActiveRecord::Base
attach_documents_as :xdocs, :XdocsDocType
end
Voici le code du plugin
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
et enfin la forme
<%= 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 %>
Êtes-vous sûr de ne pas avoir appelé un code inexistant? Pouvez-vous nous envoyer le code du contrôleur afin que nous obtenions beaucoup de clarté à ce sujet? – Kunday
Mise à jour de la question avec le code. –