【问题标题】:rails: using a class defined in another modulerails:使用在另一个模块中定义的类
【发布时间】:2012-05-30 09:51:10
【问题描述】:

当我尝试运行我的应用程序时出现以下错误:

uninitialized constant RegistrationsController::User_serial

在我的 config/application.rb 中,我有:

config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]

在我的 registrations_controller.rb 中,我有以下内容:

class RegistrationsController < Devise::RegistrationsController
  ........

def create
    @user = User.new(params[:user])

    user_serial_local = User_serial.new #initialize class defined in lib/my_tools.rb
    date_time_local = Date_formatter.new
    ......

在 lib/my_tools.rb 中,我定义了一些类:

class User_serial
  def self.calculate(first,last)
    first_3 = first[0..2]
    last_4 = last[0..3]
    time = Time.now.to_i
    return first_3 + last_4 + time.to_s
  end 
end

class Date_formatter
  def self.datetime
    return Time.now.strftime("%Y-%m-%d %H:%M:%S")
  end
end

有很多关于覆盖类的引用,以及有关如何确保包含在 lib 文件夹中的任何内容的说明(在我的代码中遵循)。为什么我会收到错误消息?

【问题讨论】:

    标签: ruby-on-rails class methods scope


    【解决方案1】:

    要让 Rails 的魔法加载工作,它需要能够仅根据类名找到定义类/模块的文件。

    这反过来意味着要遵守 Rails 的命名约定并将内容放在 Rails 期望的地方:UserSerial 应该在 user_serial.rb 中定义。您可能可以让 User_serial 作为类名工作,但 rails 永远不会在 my_tools.rb 中查找该类。

    【讨论】:

    • 请注意我对 config/application.rb 所做的修改,告诉它自动加载 lib 文件夹中的所有内容。这来自 Rails 在线文档,以及我在 StavkOverflow 上找到的一些答案。你是说这不正确吗?
    • 这会将其中的任何子文件夹添加到 rails 将搜索 user_serial.rb 的位置列表中。在生产中,rails 实际上会在应用启动时加载所有这些文件,但在开发中它们只是按需加载。
    • 那么,我应该把 UserSerial 放在哪里?在 helpers/registrations_helper.rb 或 helpers/user_serial.rb 中?
    • Rails 希望它位于自动加载路径(例如 lib)中任何文件夹的 user_serial.rb 中。助手可能会工作,但通常你只把视图助手放在那里
    • 以下工作:在 my_tools.rb 中声明您将使用的类/方法并将其放在 lib 文件夹中,然后在 registrations_controller.rb 中添加以下内容: require 'my_tools.rb'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多