Ruby on Rails要求不起作用?

时间:2015-05-06 21:26:54

标签: ruby-on-rails ruby

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

3 个答案:

答案 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
这样你就不会创造无用的常数。