我是开发rails应用程序的新手,所以在这里的大部分时间里,我只严重依赖rails generate命令来为整个应用程序制作支架。虽然我的应用程序的其他部分都运行良好,但这一部分在自动生成后会引发错误。
错误如下:
NoMethodError in ConfigurationsController#index
undefined method `all' for ActiveSupport::Configurable::Configuration:Class
这是包含所说的无方法调用的代码片段
def index
@configurations = Configuration.all
end
这是所说的模型
class Configuration < ActiveRecord::Base
belongs_to :users, class_name: 'User', foreign_key: 'user_id'
end
我添加了以下部分。。。不管怎样,当我把它看完的时候http://localhost.localhost:3000/users/1/configurations/那个错误弹出了!(是的,我使用了嵌套路由)
因此,我点击rails控制台查看Configuration.all返回的内容,并查看
2.0.0-p247 :004 > Configuration.all
Configuration Load (0.3ms) SELECT "configurations".* FROM "configurations"
=> #<ActiveRecord::Relation [#<Configuration id: 1, user_id: 1, port: 3000, host: "example.org", annoy: 5000, version: "1", machines: nil, created_at: "2013-08-08 02:15:32", updated_at: "2013-08-08 02:15:32">]>
我有点不明白为什么这个方法在rails控制台中有效,然后在浏览器的html视图中失败。我做错什么了吗?
另外,这是webrick上的输出,以防有人在上寻找
Started GET "/users/1/configurations/" for 192.168.1.105 at 2013-08-08 10:24:59 +0800
Processing by ConfigurationsController#index as HTML
Parameters: {"user_id"=>"1"}
Completed 500 Internal Server Error in 1ms
NoMethodError (undefined method `all' for ActiveSupport::Configurable::Configuration:Class):
app/controllers/configurations_controller.rb:8:in `index'
不幸的是,您创建了一个类,该类的名称也是Rails API的一部分(尽管在不同的名称空间中)。您的类恰好位于顶级名称空间,而Rails类嵌套在ActiveSupport::Configurable
名称空间中。当引用Configuration
时,实际得到的类取决于引用代码的位置。
要指定要将类放在顶级命名空间中,可以将类称为::Configuration
。
这里有一个简化的测试来演示正在发生的事情:
# Let's say this module & class is defined by a library (e.g. Rails)
module Configurable # analogous to ActiveSupport::Configurable
class Configuration # analogous to ActiveSupport::Configurable::Configuration
end
end
class ControllerBase # analogous to ActionController::Base
# ActionController::Base includes ActiveSupport::Configurable.
# You can confirm this in Rails 4 that this returns true:
# ActionController::Base.included_modules.include? ActiveSupport::Configurable
include Configurable
end
# This is your class and constant
class Configuration
end
class MyController < ControllerBase
# This is analogous to code inside your Controller.
# Inheriting gives you access to the constants in the parent
def wrong_class
Configuration # oops, we wanted the top-level
end
def correct_class
::Configuration
end
end
# top-level scope
p(top_level_access: Configuration.name) # 'Configuration'
p(nested_access: MyController.new.wrong_class.name) # 'Configurable::Configuration'
p(scoped_nested_access: MyController.new.correct_class.name) # 'Configuration'
编辑-回复@maru的评论:
在大多数情况下,您只需使用Configuration.name
即可获得类的完全名称空间名称。在控制台上试试这个。
如果您在控制器中尝试Rails.logger.info(Configuration.name)
,您可能会在日志中看到ActiveSupport::Configurable::Configuration
。