在实例化类时,Rails未初始化为常量

use*_*788 4 ruby ruby-on-rails ruby-on-rails-3

我在app/datatables的文件夹结构下的Rails应用程序中创建了一个新类

该类保存在此目录的文件中,并保存为DatasetIndexDatatable.rb

类文件的内容如下:

class DatasetIndexDatatable
  delegate :params, :h, :link_to, :number_to_currency, to: :@view

  def initialize(view)
    @view = view
  end

end
Run Code Online (Sandbox Code Playgroud)

当我尝试从我的应用程序中的控制器实例化此类时,Rails给出错误:

uninitialized constant DatadescriptionController::DatasetIndexDatatable
Run Code Online (Sandbox Code Playgroud)

尝试实例化新类的控制器中的代码如下:

class DatadescriptionController < ApplicationController
  layout "datadescription"

  def index
respond_to do |format|
        format.html
        format.json { render json: DatasetIndexDatatable.new(view_context) }
    end
  end

end
Run Code Online (Sandbox Code Playgroud)

为什么Rails不能看到新类?我尝试将包含该类的文件夹添加到application.rb中的config.autoload_paths变量中:

config.autoload_paths += %W(#{config.root}/lib
                            #{config.root}/datatables)
Run Code Online (Sandbox Code Playgroud)

但是会发生同样的错误.我还尝试使用全局命名空间在控制器中实例化新类:

format.json { render json: ::DatasetIndexDatatable.new(view_context) }
Run Code Online (Sandbox Code Playgroud)

并使用类的包含文件夹作为命名空间:

format.json { render json: Datatables::DatasetIndexDatatable.new(view_context) }
Run Code Online (Sandbox Code Playgroud)

一切都无济于事.我究竟做错了什么?

lur*_*ker 14

该文件名称不正确.代替:

DatasetIndexDatatable.rb
Run Code Online (Sandbox Code Playgroud)

叫它:

dataset_index_datatable.rb
Run Code Online (Sandbox Code Playgroud)

这是Rails标准命名约定.如果定义了一个CamelCase类,则应该命名包含该定义的文件,该文件camel_case.rb是带有下划线的小写.