这是我的第一个RoR应用程序。
我想使用这个类(app/models/from_db/users/user_base.rb)
module FromDb::Users
class UserBase
include ActiveModel::Serializers::JSON
attr_accessor :Login, :Email
end
end
在此控制器中(应用/控制器/my_controller.rb)
class MyController < ApplicationController
require "from_db/users/user_base"
def default
user = UserBase.new
user.Login = "Marcin"
user.Email = "ja@gmail.com"
end
end
user = UserBase.new 抛出此错误:
未初始化的常量 MyController::UserBase
当我输入 FromDb::Users::UserBase.new 时,一切正常,但我认为"require"就像 C# 中的"使用"或 Java 中的"导入"。我不想在从其他目录上课之前一直放置这个命名空间。我做错了什么?
我的第二个问题。有没有办法写需要"FromDb/Users/UserBase"而不是需要"from_db/用户/user_base">?现在,当我输入第一个版本(FromDb/Users/UserBase)时,它会抛出该错误:
无法加载此类文件 -- FromDb/Users/UserBase
我使用 ruby 2.1.5 和 Rails 4.2.1
虽然require
类似于Java的import
,但它没有任何import
提供的命名空间操作。如果您真的想要更短的引用,则需要自己创建它们。
class MyController < ApplicationController
UserBase = FromDb::Users::UserBase
def default
user = UserBase.new
# ... etc
end
end
此外,由于这是一个 Rails 应用程序,因此您不需要显式调用来require
(最好将其关闭)。如果您按照标准约定命名所有内容,Rails 将自动为您require
文件,然后在文件更改时重新加载它。如果您执行手动require
您将失去自动重新加载。
关于第一个问题,请尝试以下方法导入命名空间
include FromDb::Users
不要到处使用导入,因为它们可能会导致类内发生冲突(请参阅apneadiving的评论)。
或者干脆创建一个别名:
FUsers = FromDb::Users
FUsers::UserBase.new...
require
只是将文件的内容加载到内存中,所以你仍然必须使用FromDb::Users::UserBase
,我推荐它,它更清晰。
你不能把这个名字弄脏:它应该是一个文件名。
你必须给出从根开始的路径,它更安全:
require "#{Rails.root}/app/models/from_db/users/user_base"
请注意,您不需要require
,因为您的代码/app
为了创建一个快捷方式,您可以执行以下操作:
def default
user = user_base_class.new
end
def user_base_class
::FromDb::Users::UserBase
end
这样你就不会创建无用的常量。