Ruby on Rails 要求不起作用?



这是我的第一个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

这样你就不会创建无用的常量。

最新更新