2013-05-03 72 views
2

我在Windows上。 Ruby v.1.9.3p392/Rails v。3.2.13 - 這是Michael Hart的Ruby on Rails教程第2章中的demo_app項目。dynamic_matchers.rb:55:在`method_missing':未定義的方法`migration_error ='爲ActiveRecord :: Base:Class(NoMethodError)

當我發出'rails生成腳手架用戶名:字符串電子郵件:字符串'任何想法如何解決這個問題?

C:\ruby\rails_projects\demo_app>rails generate scaffold User name:string email:s 
tring 
     invoke active_record 
C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activerecord-3.2.13/lib/act 
ive_record/dynamic_matchers.rb:55:in `method_missing': undefined method `migrati 
on_error=' for ActiveRecord::Base:Class (NoMethodError) 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activerecord-3 
.2.13/lib/active_record/railtie.rb:66:in `block (3 levels) in <class:Railtie>' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activerecord-3 
.2.13/lib/active_record/railtie.rb:65:in `each' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activerecord-3 
.2.13/lib/active_record/railtie.rb:65:in `block (2 levels) in <class:Railtie>' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activesupport- 
3.2.13/lib/active_support/lazy_load_hooks.rb:36:in `instance_eval' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activesupport- 
3.2.13/lib/active_support/lazy_load_hooks.rb:36:in `execute_hook' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activesupport- 
3.2.13/lib/active_support/lazy_load_hooks.rb:43:in `block in run_load_hooks' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activesupport- 
3.2.13/lib/active_support/lazy_load_hooks.rb:42:in `each' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activesupport- 
3.2.13/lib/active_support/lazy_load_hooks.rb:42:in `run_load_hooks' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activerecord-3 
.2.13/lib/active_record/base.rb:720:in `<top (required)>' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.1 
3/lib/rails/generators/named_base.rb:166:in `pluralize_table_names?' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.1 
3/lib/rails/generators/named_base.rb:114:in `table_name' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activerecord-3 
.2.13/lib/rails/generators/active_record/model/model_generator.rb:17:in `create_ 
migration_file' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/command.rb:27:in `run' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/invocation.rb:120:in `invoke_command' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/invocation.rb:127:in `block in invoke_all' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/invocation.rb:127:in `each' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/invocation.rb:127:in `map' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/invocation.rb:127:in `invoke_all' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/group.rb:233:in `dispatch' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/invocation.rb:109:in `invoke' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/group.rb:278:in `block in _invoke_for_class_method' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/shell.rb:74:in `with_padding' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/group.rb:267:in `_invoke_for_class_method' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/group.rb:150:in `_invoke_from_option_orm' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/command.rb:27:in `run' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/invocation.rb:120:in `invoke_command' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/invocation.rb:127:in `block in invoke_all' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/invocation.rb:127:in `each' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/invocation.rb:127:in `map' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/invocation.rb:127:in `invoke_all' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/group.rb:233:in `dispatch' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/thor-0.18.1/li 
b/thor/base.rb:439:in `start' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.1 
3/lib/rails/generators.rb:171:in `invoke' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.1 
3/lib/rails/commands/generate.rb:12:in `<top (required)>' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activesupport- 
3.2.13/lib/active_support/dependencies.rb:251:in `require' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activesupport- 
3.2.13/lib/active_support/dependencies.rb:251:in `block in require' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activesupport- 
3.2.13/lib/active_support/dependencies.rb:236:in `load_dependency' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activesupport- 
3.2.13/lib/active_support/dependencies.rb:251:in `require' 
     from C:/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.1 
3/lib/rails/commands.rb:29:in `<top (required)>' 
     from bin/rails:4:in `require' 
     from bin/rails:4:in `<main>' 

dynamic_matchers.rb

module ActiveRecord 
    module DynamicMatchers 
    def respond_to?(method_id, include_private = false) 
     if match = DynamicFinderMatch.match(method_id) 
     return true if all_attributes_exists?(match.attribute_names) 
     elsif match = DynamicScopeMatch.match(method_id) 
     return true if all_attributes_exists?(match.attribute_names) 
     end 

     super 
    end 

    private 

    # Enables dynamic finders like <tt>User.find_by_user_name(user_name)</tt> and 
    # <tt>User.scoped_by_user_name(user_name). Refer to Dynamic attribute-based finders 
    # section at the top of this file for more detailed information. 
    # 
    # It's even possible to use all the additional parameters to +find+. For example, the 
    # full interface for +find_all_by_amount+ is actually <tt>find_all_by_amount(amount, options)</tt>. 
    # 
    # Each dynamic finder using <tt>scoped_by_*</tt> is also defined in the class after it 
    # is first invoked, so that future attempts to use it do not run through method_missing. 
    def method_missing(method_id, *arguments, &block) 
     if match = (DynamicFinderMatch.match(method_id) || DynamicScopeMatch.match(method_id)) 
     attribute_names = match.attribute_names 
     super unless all_attributes_exists?(attribute_names) 
     if !(match.is_a?(DynamicFinderMatch) && match.instantiator? && arguments.first.is_a?(Hash)) && arguments.size < attribute_names.size 
      method_trace = "#{__FILE__}:#{__LINE__}:in `#{method_id}'" 
      backtrace = [method_trace] + caller 
      raise ArgumentError, "wrong number of arguments (#{arguments.size} for #{attribute_names.size})", backtrace 
     end 
     if match.respond_to?(:scope?) && match.scope? 
      self.class_eval <<-METHOD, __FILE__, __LINE__ + 1 
      def self.#{method_id}(*args)         # def self.scoped_by_user_name_and_password(*args) 
       attributes = Hash[[:#{attribute_names.join(',:')}].zip(args)] # attributes = Hash[[:user_name, :password].zip(args)] 
                      # 
       scoped(:conditions => attributes)        # scoped(:conditions => attributes) 
      end                # end 
      METHOD 
      send(method_id, *arguments) 
     elsif match.finder? 
      options = if arguments.length > attribute_names.size 
         arguments.extract_options! 
        else 
         {} 
        end 

      relation = options.any? ? scoped(options) : scoped 
      relation.send :find_by_attributes, match, attribute_names, *arguments, &block 
     elsif match.instantiator? 
      scoped.send :find_or_instantiator_by_attributes, match, attribute_names, *arguments, &block 
     end 
     else 
     super 
     end 
    end 

    # Similar in purpose to +expand_hash_conditions_for_aggregates+. 
    def expand_attribute_names_for_aggregates(attribute_names) 
     attribute_names.map { |attribute_name| 
     unless (aggregation = reflect_on_aggregation(attribute_name.to_sym)).nil? 
      aggregate_mapping(aggregation).map do |field_attr, _| 
      field_attr.to_sym 
      end 
     else 
      attribute_name.to_sym 
     end 
     }.flatten 
    end 

    def all_attributes_exists?(attribute_names) 
     (expand_attribute_names_for_aggregates(attribute_names) - 
     column_methods_hash.keys).empty? 
    end 

    def aggregate_mapping(reflection) 
     mapping = reflection.options[:mapping] || [reflection.name, reflection.name] 
     mapping.first.is_a?(Array) ? mapping : [mapping] 
    end 


    end 
end 

回答

7

好了,別人能找到解決這個問題,我會在這裏分享的情況下它談到了別人。

顯然,我創建的應用程序生成了舊的rails版本,即使我的rails版本設置爲最新版本。 3.2.13

因此,我的config/application.rb文件與rails 3.2.13版本完全不同。在替換application.rb文件後。錯誤是固定的。

爲避免此錯誤,您可以使用rvm或pik(如果您是Windows用戶來控制當前版本)。您可以創建新的應用程序時註明您的軌道版本「軌3.2.13 your_app」,或卸載所有軌道版本,並只安裝你需要的:

寶石卸載軌道 - 選擇所有版本

創業板安裝導軌--version '= 3.2.13'

+0

實際上,它應該是「軌新demo_app 3.2.13」指定軌道如果需要,應用程序的版本。 – LilithX 2013-05-06 23:10:31

+0

對不起,這是正確的命令'rails _3.2.13_ new newappname' – LilithX 2013-05-07 00:48:51

+0

嗯,是的版本說明仍然是錯誤的。大聲笑,但它不需要。 rails會默認安裝最新版本;) – RGB 2013-07-05 15:58:15

1

謝謝你的建議(+1),我有同樣的問題...

創建應用程序初始化ially與舊版本的Rails,並碰撞到最新的(3.2.13),這打破了我的色器件東西..

所有這一切都需要的是增加require "rails/all"config/application.rb

0

頂我也有類似問題是抱怨一個未定義的方法:'has_many'。我花了一段時間擺脫了ruby和rails版本和寶石之後才意識到這個問題...... has_many之前的額外空間!

我從另一個地方複製舊代碼(印象筆記,使用各種奇怪的格式),並沒有意識到空白細節可能會搞砸這樣的事情。刪除空格並將其重新放入手動修復問題。

(這是不是一個真正的答案,原來的問題,但我的搜查,我在這裏和這裏可能導致他人。)

相關問題