Stephen Gerstacker
2006-Jun-20 20:12 UTC
[Rails] Problem with "can''t dump anonymous class Class"
I submitted this earlier, but the web forums went down and I''ve screwed
up
the thread, so I''m starting over.
I''m trying to built a document upload system. The system has a main
Document model with different subclasses for different types of documents.
With the code below, if I attempt to create a Document, it works fine, but
if I attempt to use one of the subclasses, I get the error:
can''t dump anonymous class Class
With an Application Trace of:
C:/Ruby/lib/ruby/1.8/yaml/rubytypes.rb:6:in `to_yaml''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/connect
ion_adapters/abstract/quoting.rb:22:in `quote''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/connect
ion_adapters/mysql_adapter.rb:123:in `quote''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1305:in `quote_bound_value''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1287:in `replace_bind_variables''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1287:in `replace_bind_variables''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1276:in `sanitize_sql''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1062:in `add_conditions!''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1012:in `construct_finder_sql''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:924:in `find_every''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:918:in `find_initial''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:380:in `find''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:528:in `validates_uniqueness_of''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:302:in `validates_each''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:299:in `validates_each''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:794:in `run_validations''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:788:in `run_validations''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:752:in `valid_without_callbacks''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/callbac
ks.rb:306:in `valid?''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:723:in `save_without_transactions''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transac
tions.rb:126:in `save''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/connect
ion_adapters/abstract/database_statements.rb:51:in `transaction''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transac
tions.rb:91:in `transaction''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transac
tions.rb:118:in `transaction''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transac
tions.rb:126:in `save''
#{RAILS_ROOT}/app/controllers/enrollment_admin_controller.rb:34:in
`save_global_document''
-e:4
Any ideas on how to fix this? If I change GlobalDocument to Document below,
it works fine.
Here is the relevant code:
** Models **
class Document < ActiveRecord::Base
attr_accessor :uploaded_file
def after_create
if !File.exists?(File.dirname(self.file_path))
Dir.mkdir(File.dirname(self.file_path))
end
if @uploaded_file.instance_of?(Tempfile)
FileUtils.copy(@uploaded_file.local_path, self.file_path)
else
File.open(self.file_path, "wb") { |f|
f.write(@uploaded_file.read) }
end
end
def after_destroy
if File.exists?(self.file_path)
File.delete(self.file_path)
end
end
def file=(uploaded_file)
@uploaded_file = uploaded_file
self.file_path = sanitize_filename(@uploaded_file.original_filename)
self.content_type = @uploaded_file.content_type
end
private
def new_filename(file_name)
idx = file_name.rindex "."
self.name.gsub(/[^\w\.\_]/, ''_'') + file_name[idx,
file_name.length -
idx]
end
def sanitize_filename(file_name)
File.expand_path("#{RAILS_ROOT}/public/documents/#{new_filename(file_name)}"
)
end
end
class GlobalDocument < Document
validates_uniqueness_of :name, :scope => :type
private
def sanitize_filename(file_name)
File.expand_path("#{RAILS_ROOT}/public/documents/global/#{new_filename(file_
name)}")
end
end
** Controller **
def documents
@new_document = GlobalDocument.new
end
def save_global_document
doc = GlobalDocument.new(params[:new_document])
if doc.save
flash[:notice] = "<em>#{doc.name}</em> was saved"
else
flash[:error] = doc.errors.full_messages.join("<br />")
end
redirect_to :action => :documents
end
** View **
documents.rhtml
<%= form_tag({ :action => :save_global_document }, { :multipart =>
true
}) %>
<table class="layout_table">
<tr>
<td class="right"><label
for="new_document_name"
class="required">Name:</label></td>
<td><%= text_field :new_document, :name, :class =>
"fixed"
%></td>
</tr>
<tr>
<td class="right"><label
for="new_document_file"
class="required">File:</label></td>
<td><%= file_field :new_document, :file, :class =>
"fixed"
%></td>
</tr>
<tr>
<td></td>
<td><%= submit_tag "Upload file" %></td>
</tr>
</table>
<%= end_form_tag %>
Stephen Gerstacker
2006-Jun-21 15:52 UTC
[Rails] Problem with "can''t dump anonymous class Class"
If found the problem but don''t understand it. The problem is the
''validates_uniqueness_of :name, :scope => :type'' line.
If I take it out, it works
If I make it ''validates_uniqueness_of :name'', it works
If I make it ''validates_uniqueness_of :name, :scope =>
:type'', it doesn''t
work.
Why would this happen?
Stephen Gerstacker
-----Original Message-----
From: rails-bounces@lists.rubyonrails.org
[mailto:rails-bounces@lists.rubyonrails.org] On Behalf Of Stephen Gerstacker
Sent: Tuesday, June 20, 2006 16:13
To: rails@lists.rubyonrails.org
Subject: [Rails] Problem with "can''t dump anonymous class
Class"
I submitted this earlier, but the web forums went down and I''ve screwed
up
the thread, so I''m starting over.
I''m trying to built a document upload system. The system has a main
Document model with different subclasses for different types of documents.
With the code below, if I attempt to create a Document, it works fine, but
if I attempt to use one of the subclasses, I get the error:
can''t dump anonymous class Class
With an Application Trace of:
C:/Ruby/lib/ruby/1.8/yaml/rubytypes.rb:6:in `to_yaml''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/connect
ion_adapters/abstract/quoting.rb:22:in `quote''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/connect
ion_adapters/mysql_adapter.rb:123:in `quote''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1305:in `quote_bound_value''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1287:in `replace_bind_variables''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1287:in `replace_bind_variables''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1276:in `sanitize_sql''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1062:in `add_conditions!''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1012:in `construct_finder_sql''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:924:in `find_every''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:918:in `find_initial''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:380:in `find''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:528:in `validates_uniqueness_of''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:302:in `validates_each''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:299:in `validates_each''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:794:in `run_validations''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:788:in `run_validations''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:752:in `valid_without_callbacks''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/callbac
ks.rb:306:in `valid?''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:723:in `save_without_transactions''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transac
tions.rb:126:in `save''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/connect
ion_adapters/abstract/database_statements.rb:51:in `transaction''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transac
tions.rb:91:in `transaction''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transac
tions.rb:118:in `transaction''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transac
tions.rb:126:in `save''
#{RAILS_ROOT}/app/controllers/enrollment_admin_controller.rb:34:in
`save_global_document''
-e:4
Any ideas on how to fix this? If I change GlobalDocument to Document below,
it works fine.
Here is the relevant code:
** Models **
class Document < ActiveRecord::Base
attr_accessor :uploaded_file
def after_create
if !File.exists?(File.dirname(self.file_path))
Dir.mkdir(File.dirname(self.file_path))
end
if @uploaded_file.instance_of?(Tempfile)
FileUtils.copy(@uploaded_file.local_path, self.file_path)
else
File.open(self.file_path, "wb") { |f|
f.write(@uploaded_file.read) }
end
end
def after_destroy
if File.exists?(self.file_path)
File.delete(self.file_path)
end
end
def file=(uploaded_file)
@uploaded_file = uploaded_file
self.file_path = sanitize_filename(@uploaded_file.original_filename)
self.content_type = @uploaded_file.content_type
end
private
def new_filename(file_name)
idx = file_name.rindex "."
self.name.gsub(/[^\w\.\_]/, ''_'') + file_name[idx,
file_name.length -
idx]
end
def sanitize_filename(file_name)
File.expand_path("#{RAILS_ROOT}/public/documents/#{new_filename(file_name)}"
)
end
end
class GlobalDocument < Document
validates_uniqueness_of :name, :scope => :type
private
def sanitize_filename(file_name)
File.expand_path("#{RAILS_ROOT}/public/documents/global/#{new_filename(file_
name)}")
end
end
** Controller **
def documents
@new_document = GlobalDocument.new
end
def save_global_document
doc = GlobalDocument.new(params[:new_document])
if doc.save
flash[:notice] = "<em>#{doc.name}</em> was saved"
else
flash[:error] = doc.errors.full_messages.join("<br />")
end
redirect_to :action => :documents
end
** View **
documents.rhtml
<%= form_tag({ :action => :save_global_document }, { :multipart =>
true
}) %>
<table class="layout_table">
<tr>
<td class="right"><label
for="new_document_name"
class="required">Name:</label></td>
<td><%= text_field :new_document, :name, :class =>
"fixed"
%></td>
</tr>
<tr>
<td class="right"><label
for="new_document_file"
class="required">File:</label></td>
<td><%= file_field :new_document, :file, :class =>
"fixed"
%></td>
</tr>
<tr>
<td></td>
<td><%= submit_tag "Upload file" %></td>
</tr>
</table>
<%= end_form_tag %>
_______________________________________________
Rails mailing list
Rails@lists.rubyonrails.org
http://lists.rubyonrails.org/mailman/listinfo/rails
Stephen Gerstacker
2006-Jun-21 19:40 UTC
[Rails] Problem with "can''t dump anonymous class Class"
To answer my own question...
With STI, ''validates_uniqueness_of :name'' is limited to the
subclass, so
doing '':scope => :type'' isn''t needed.
Stephen Gerstacker
-----Original Message-----
From: rails-bounces@lists.rubyonrails.org
[mailto:rails-bounces@lists.rubyonrails.org] On Behalf Of Stephen Gerstacker
Sent: Wednesday, June 21, 2006 11:52
To: rails@lists.rubyonrails.org
Subject: RE: [Rails] Problem with "can''t dump anonymous class
Class"
If found the problem but don''t understand it. The problem is the
''validates_uniqueness_of :name, :scope => :type'' line.
If I take it out, it works
If I make it ''validates_uniqueness_of :name'', it works
If I make it ''validates_uniqueness_of :name, :scope =>
:type'', it doesn''t
work.
Why would this happen?
Stephen Gerstacker
-----Original Message-----
From: rails-bounces@lists.rubyonrails.org
[mailto:rails-bounces@lists.rubyonrails.org] On Behalf Of Stephen Gerstacker
Sent: Tuesday, June 20, 2006 16:13
To: rails@lists.rubyonrails.org
Subject: [Rails] Problem with "can''t dump anonymous class
Class"
I submitted this earlier, but the web forums went down and I''ve screwed
up
the thread, so I''m starting over.
I''m trying to built a document upload system. The system has a main
Document model with different subclasses for different types of documents.
With the code below, if I attempt to create a Document, it works fine, but
if I attempt to use one of the subclasses, I get the error:
can''t dump anonymous class Class
With an Application Trace of:
C:/Ruby/lib/ruby/1.8/yaml/rubytypes.rb:6:in `to_yaml''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/connect
ion_adapters/abstract/quoting.rb:22:in `quote''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/connect
ion_adapters/mysql_adapter.rb:123:in `quote''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1305:in `quote_bound_value''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1287:in `replace_bind_variables''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1287:in `replace_bind_variables''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1276:in `sanitize_sql''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1062:in `add_conditions!''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:1012:in `construct_finder_sql''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:924:in `find_every''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:918:in `find_initial''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/base.rb
:380:in `find''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:528:in `validates_uniqueness_of''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:302:in `validates_each''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:299:in `validates_each''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:794:in `run_validations''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:788:in `run_validations''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:752:in `valid_without_callbacks''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/callbac
ks.rb:306:in `valid?''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/validat
ions.rb:723:in `save_without_transactions''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transac
tions.rb:126:in `save''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/connect
ion_adapters/abstract/database_statements.rb:51:in `transaction''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transac
tions.rb:91:in `transaction''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transac
tions.rb:118:in `transaction''
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/active_record/transac
tions.rb:126:in `save''
#{RAILS_ROOT}/app/controllers/enrollment_admin_controller.rb:34:in
`save_global_document''
-e:4
Any ideas on how to fix this? If I change GlobalDocument to Document below,
it works fine.
Here is the relevant code:
** Models **
class Document < ActiveRecord::Base
attr_accessor :uploaded_file
def after_create
if !File.exists?(File.dirname(self.file_path))
Dir.mkdir(File.dirname(self.file_path))
end
if @uploaded_file.instance_of?(Tempfile)
FileUtils.copy(@uploaded_file.local_path, self.file_path)
else
File.open(self.file_path, "wb") { |f|
f.write(@uploaded_file.read) }
end
end
def after_destroy
if File.exists?(self.file_path)
File.delete(self.file_path)
end
end
def file=(uploaded_file)
@uploaded_file = uploaded_file
self.file_path = sanitize_filename(@uploaded_file.original_filename)
self.content_type = @uploaded_file.content_type
end
private
def new_filename(file_name)
idx = file_name.rindex "."
self.name.gsub(/[^\w\.\_]/, ''_'') + file_name[idx,
file_name.length -
idx]
end
def sanitize_filename(file_name)
File.expand_path("#{RAILS_ROOT}/public/documents/#{new_filename(file_name)}"
)
end
end
class GlobalDocument < Document
validates_uniqueness_of :name, :scope => :type
private
def sanitize_filename(file_name)
File.expand_path("#{RAILS_ROOT}/public/documents/global/#{new_filename(file_
name)}")
end
end
** Controller **
def documents
@new_document = GlobalDocument.new
end
def save_global_document
doc = GlobalDocument.new(params[:new_document])
if doc.save
flash[:notice] = "<em>#{doc.name}</em> was saved"
else
flash[:error] = doc.errors.full_messages.join("<br />")
end
redirect_to :action => :documents
end
** View **
documents.rhtml
<%= form_tag({ :action => :save_global_document }, { :multipart =>
true
}) %>
<table class="layout_table">
<tr>
<td class="right"><label
for="new_document_name"
class="required">Name:</label></td>
<td><%= text_field :new_document, :name, :class =>
"fixed"
%></td>
</tr>
<tr>
<td class="right"><label
for="new_document_file"
class="required">File:</label></td>
<td><%= file_field :new_document, :file, :class =>
"fixed"
%></td>
</tr>
<tr>
<td></td>
<td><%= submit_tag "Upload file" %></td>
</tr>
</table>
<%= end_form_tag %>
_______________________________________________
Rails mailing list
Rails@lists.rubyonrails.org
http://lists.rubyonrails.org/mailman/listinfo/rails
_______________________________________________
Rails mailing list
Rails@lists.rubyonrails.org
http://lists.rubyonrails.org/mailman/listinfo/rails