2011-10-06 7 views
6

Il bug è molti mesi, qui:Vecchio Rubino bug è ricorrente nel mio Ruby on Rails app, relative al Class.create e delayed_job

http://www.ruby-forum.com/topic/1094002

Due collegamenti a ciò che mostrano le modifiche del codice:

https://github.com/godfat/ruby/commit/f4e0e8f781b05c767ad2472a43a4ed0727a75708 https://github.com/godfat/ruby/commit/c7a6cf975d88828c2ed27d253f41c480f9b66ad6

devo rubino 1.9.2 e rvm. Avrei incollato quelle modifiche nei file appropriati, ma non so come.

Questo ha funzionato pochi giorni fa. Non posso fare Ruby on Rails comandi come:

>> User.create :username => "a", :password => "a" 

Ecco il messaggio di errore:

ArgumentError: wrong number of arguments(1 for 0) 
from /Users/RedApple/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych/visitors/yaml_tree.rb:48:in `method' 
from /Users/RedApple/.rvm/rubies/ruby-1.9.2 p290/lib/ruby/1.9.1/psych/visitors/yaml_tree.rb:48:in `accept' 
from /Users/RedApple/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych/visitors/yaml_tree.rb:36:in `<<' 
from /Users/RedApple/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:165:in `dump' 
from /Users/RedApple/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych/core_ext.rb:13:in `psych_to_yaml' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.0.4/lib/delayed/backend/base.rb:57:in `payload_object=' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/base.rb:2918:in `block in assign_attributes' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/base.rb:2914:in `each' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/base.rb:2914:in `assign_attributes' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/base.rb:2787:in `attributes=' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/base.rb:2477:in `initialize' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/base.rb:725:in `new' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/base.rb:725:in `create' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/delayed_job-2.0.4/lib/delayed/message_sending.rb:9:in `method_missing' 
from /Users/RedApple/S/app/models/user.rb:29:in `block in <class:User>' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-2.3.14/lib/active_support/callbacks.rb:182:in `call' 
... 7 levels... 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/callbacks.rb:267:in `create_with_callbacks' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/base.rb:2927:in `create_or_update' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/callbacks.rb:250:in `create_or_update_with_callbacks' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/base.rb:2577:in `save' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/validations.rb:1089:in `save_with_validation' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/dirty.rb:79:in `save_with_dirty' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/transactions.rb:229:in `block in with_transaction_returning_status' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/transactions.rb:182:in `transaction' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/transactions.rb:228:in `with_transaction_returning_status' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/transactions.rb:196:in `block in save_with_transactions' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/transactions.rb:208:in `rollback_active_record_state!' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/transactions.rb:196:in `save_with_transactions' 
from /Users/RedApple/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-2.3.14/lib/active_record/base.rb:727:in `create' 
from (irb):1 
from /Users/RedApple/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in `<main>'> 

linea 28-30 in user.rb:

after_create do |user| 
    user.delay(:priority => -15).seed 
end 

sono morto nell'acqua senza questo. Qualcuno può aiutare?

+0

Aggiornamento: Sono passato a usare Ruby 1.8.7 e questo non è più un problema, il che significa che è chiaramente un bug di Ruby 1.9.2. Mi piacerebbe comunque una soluzione poiché è meglio utilizzare lo stesso ambiente nello sviluppo e nella produzione. Aggiornamento – Eric

+0

: Anche se funziona in 1.8.7, ho altri problemi con 1.8.7, quindi ho davvero bisogno che funzioni in 1.9.2. – Eric

risposta

6

Il lavoro ritardato e il parser Ruby 1.9.2 YAML (Psych) non sono purtroppo compatibili.

tornare alla YAML precedente parser (syck) con l'aggiunta di questo alla vostra config/application.rb, appena sotto la chiamata a Bundler.require:

YAML::ENGINE.yamler = "syck" if RUBY_VERSION >= "1.9.2" 
+0

Grazie mille. L'ho effettivamente incollato in config/environment.rb. Ora funziona. – Eric

+0

Questo non mi sembra una buona soluzione. Tutti i documenti indicano che il Ps è il backend YAML preferito ora. – simianarmy

+0

@simianarmy, tutto molto bello, ma fino a quando il lavoro ritardato non viene risolto, non c'è altro modo. – molf

1

Si potrebbe applicare la patch al Ruby, ma non è facile e non è davvero possibile in host gestiti. La mia soluzione era quella di creare un monkeypatch basata sulla patch commettere 31075.

Creare un file di inizializzazione nelle vostre Rails proiettare config/inizializzatori/psych_extensions.rb e aggiungere questo codice:

# APPLIES RUBY PATCH REVISION 31075 

module Psych 
    module Visitors 
    ### 
    # YAMLTree builds a YAML ast given a ruby object. For example: 
    # 
    # builder = Psych::Visitors::YAMLTree.new 
    # builder << { :foo => 'bar' } 
    # builder.tree # => #<Psych::Nodes::Stream .. } 
    # 
    class YAMLTree < Psych::Visitors::Visitor 

     def accept target 
     # return any aliases we find 
     if node = @st[target.object_id] 
      node.anchor = target.object_id.to_s 
      return @emitter.alias target.object_id.to_s 
     end 

     if target.respond_to?(:to_yaml) 
      loc = target.public_method(:to_yaml).source_location.first 
      if loc !~ /(syck\/rubytypes.rb|psych\/core_ext.rb)/ 
      unless target.respond_to?(:encode_with) 
       if $VERBOSE 
       warn "implementing to_yaml is deprecated, please implement \"encode_with\"" 
       end 

       target.to_yaml(:nodump => true) 
      end 
      end 
     end 

     if target.respond_to?(:encode_with) 
      dump_coder target 
     else 
      send(@dispatch_cache[target.class], target) 
     end 
     end 

     private 

     # FIXME: remove this method once "to_yaml_properties" is removed 
     def find_ivars target 
     loc = target.public_method(:to_yaml_properties).source_location.first 
     unless loc.start_with?(Psych::DEPRECATED) || loc.end_with?('rubytypes.rb') 
      if $VERBOSE 
      warn "#{loc}: to_yaml_properties is deprecated, please implement \"encode_with(coder)\"" 
      end 
      return target.to_yaml_properties 
     end 

     target.instance_variables 
     end 

    end 
    end 
end