2013-05-03 73 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之前的额外空间!

我从另一个地方复制旧代码(印象笔记,使用各种奇怪的格式),并没有意识到空白细节可能会搞砸这样的事情。删除空格并将其重新放入手动修复问题。

(这是不是一个真正的答案,原来的问题,但我的搜查,我在这里和这里可能导致他人。)

相关问题