【问题标题】:uninitialized constant Api未初始化的常量 Api
【发布时间】:2018-08-05 09:32:07
【问题描述】:

我仍然是 ruby​​ on rails 的初学者,我正在尝试创建一个简单的 API,但我遇到了这个错误:“未初始化的常量 Api”

ideas_controller.rb

module Api
 module V1
  class ItemsController < BaseController
    def index
     @ideas = Idea.all
     render json: @ideas
    end
  end
 end
end

routes.db

Rails.application.routes.draw do
  namespace :api do
    namespace :v1 do
      resources :ideas  
    end
  end
end

application_controller.rb

   class ApplicationController < ActionController
 protect_from_forgery with: :null_session

end

base_controller.rb

   module Api
 module V1
class BaseController < ApplicationController
  respond_to :json
end
end

项目的目录:

服务器错误:

我也尝试过这种方法并将项目的结构更改为:

另外,我启用了: config.eager_load = true 之后我收到以下错误:

`block in load_missing_constant':未初始化的常量 Api::V1::BaseController (NameError)

【问题讨论】:

  • 您是否将您的ideas_controller.rbapp/controllers/api/v1/ideas_controller.rb 这样放在api 命名空间中?
  • 请显示您的ideas_controller.rb的完整路径
  • 是的,我做到了。这是完整路径:contact-api/app/controllers/api/v1/ideas_controller.rb

标签: ruby-on-rails ruby api


【解决方案1】:

如果你在开发环境中,Eager loading 默认是关闭的,可以通过打开 Eager Load 来修复(在config/development.rb 中改为config.eager_load = true)。急切加载将允许在服务器启动时加载整个 Rails 应用程序(速度稍慢),但会解决您的问题,因为该文件将被加载。

【讨论】:

  • @RowanX 这没什么区别,我说的还是适用的。
  • 这不能解决问题。
【解决方案2】:

这个错误是因为module Api 之前没有定义,我想如果你这样做它会起作用。从答案here

module Api
 module V1
  class IdeasController < ApplicationController
    def index
     @ideas = Idea.all
     render json: @ideas
    end
  end
 end
end

另一种解决方案可能是这样的:

module Api
 module V1
 end
end
class Api::V1::IdeasController < ApplicationController
  def index
   @ideas = Idea.all
   render json: @ideas
  end
end

希望对你有帮助。

【讨论】:

  • 我已经尝试过了,实际上我在修改我的代码之前已经尝试过其中一个,但仍然得到同样的错误。
  • hmmm,您能否使用项目的routedirectory tree 更新您的问题,以及更多关于出现在 rails 服务器中的错误消息,因为根据您上面的 cmets 它应该可以工作。还有一个问题:您在添加目录并尝试了我的解决方案之一后是否重新启动了服务器?
  • 是的,我已确保在每次试用后重新启动服务器。我已更新问题详情。
  • 对不起,我需要问你更多问题: 1- 我注意到你从ApplicationController 继承而没有找到你的目录树,我应该是class ApplicationController &lt; ActionController::Base;end 的文件。 2- 您是否尝试在 Rails 控制台上输入 Api::V1::IdeasController
  • 我真的很感谢你的努力。 1-我不太明白你的说法,你的意思是我应该先创建一个基本控制器然后从它继承? 2-是的,它给了我以下错误:1:来自(irb):1 NameError(未初始化的常量Api)
【解决方案3】:

在你的想法控制器中试试这个

module Api
 module V1
  class IdeasController < Api::V1::BaseController
   def index
    @ideas = Idea.all
    render json: @ideas
   end
  end
 end
end

并通过以下方式定义您的基本控制器

class Api::V1::BaseController < ApplicationController
 respond_to :json
end

【讨论】:

  • 仍然得到“未初始化的常量 Api::V1::BaseController (NameError)”。
  • 尝试通过关注rails generate controller Api/V1/Base rails generate controller Api/V1/Ideas index再次重新创建您的文件
  • 产生错误:“输入/输出错误@dir_s_mkdir - /home=/contacts-api/app/controllers/api (Errno::EIO)”
猜你喜欢
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多