这是我的第一个RoR应用程序。
我想使用这个类(app / models / from_db / users / user_base.rb)
module FromDb::Users
class UserBase
include ActiveModel::Serializers::JSON
attr_accessor :Login, :Email
end
end
在此控制器(app / controllers / 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” require“from_db / users / user_base”的实例?现在,当我放置第一个版本(FromDb / Users / UserBase)时,它会抛出该错误:
无法加载此类文件 - FromDb / Users / UserBase
我使用ruby 2.1.5和Rails 4.2.1
答案 0 :(得分:2)
关于第一个问题,请尝试以下命令导入命名空间
include FromDb::Users
不要在整个地方使用导入,因为它们可能会导致您班级内的冲突(请参阅apneadiving的评论)。
或者只是创建一个别名:
FUsers = FromDb::Users
FUsers::UserBase.new...
答案 1 :(得分:2)
虽然require
与Java的import
类似,但它没有import
提供的任何命名空间操作内容。如果确实想要更短的引用,则需要自己创建它们。
class MyController < ApplicationController
UserBase = FromDb::Users::UserBase
def default
user = UserBase.new
# ... etc
end
end
此外,由于这是一个Rails应用程序,因此您不需要显式调用require
(如果将其关闭则更好)。如果您按照标准约定命名所有内容,Rails会自动require
该文件,然后在文件更改时重新加载。如果您执行手册require
,您将失去自动加载功能。
答案 2 :(得分:1)
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
这样你就不会创造无用的常数。