在rails

时间:2015-06-29 22:41:39

标签: ruby-on-rails ruby ruby-on-rails-4

我从uninitialized constant

访问其他class方法时收到model

模型类

class Post < ActiveRecord::Base
  before_create :fetch_data
  belongs_to :user

  def fetch_data
    self.name = 'test'
    self.get_groups = Groups.new(self.department).verdict
  end
end

群组类

class Groups
  @@current_state

  def initialize(department_arrangement)
    @@current_state = Marshal.load(Marshal.dump(department_arrangement))
  end

  def self.get_groups
    @@current_state.each do |row|
      # code
    end
    return # return some value
  end
  # more code
end

堆栈跟踪

NameError (uninitialized constant Post::Group):
  app/models/post.rb:17:in `fetch_data'
  app/controllers/post_controller.rb:19:in `create'

  Rendered /Users/komal/.rvm/gems/ruby-2.1.4/gems/actionpack-4.2.1/lib/action_dispatch/middleware/templates/rescues/_source.erb (21.1ms)
  Rendered /Users/komal/.rvm/gems/ruby-2.1.4/gems/actionpack-4.2.1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (8.7ms)
  Rendered /Users/komal/.rvm/gems/ruby-2.1.4/gems/actionpack-4.2.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.8ms)

基本上我想传递来自self.department的参数views并使用该变量我正在进行一些计算并将结果保存在数据库中。做正确的方法是什么?我想在get_groups中保留group class方法。

修改-1

我在config.autoload_paths += %W( #{config.root}/app/utility )application.rb中添加了require 'group_utility' in model class。现在我可以看到它正在调用构造函数,但它正在抛出No method exist: get-groups错误。

3 个答案:

答案 0 :(得分:2)

Ruby命名空间常量。在这里,通过调用Groups类中的Post,假设它将在所述类中找到常量。

如果要引用在当前命名空间之外声明的常量,则需要在其前面添加::

self.get_groups = ::Groups.new(self.department).verdict

如果现在这样做会引发NameError (uninitialized constant Groups):,那么就不会加载创建Groups类的文件。

答案 1 :(得分:1)

您需要“要求”其他类,如果它们位于同一目录中,请使用“require_relative”。

require_relative 'Groups'

我也是铁杆的新手,从我所看到的这一点大部分都没有完成。额外的类将存储为帮助程序。

答案 2 :(得分:0)

NameError (uninitialized constant Post::Group):

这是什么意思?

Group课程无法访问或尚未初始化。要使其可访问,您必须在config.autoload_paths += %W( #{config.root}/app/<name of the directory>)

中添加applicaiton.rb

现在,当您启动服务器时,类将自动加载。 在模型类中添加require '<class-name>'将使其可访问。正如您所说,您来自java背景,requuire <class-name>相当于import Groups

你们都已经设置好了,现在只需要访问类方法就可以通过以下代码来实现(@tonchis提到)

self.get_groups = ::Groups.new(self.department).verdict