0

我注意到了concernrails4 的新特性,我在http://edgeapi.rubyonrails.org/classes/ActiveSupport/Concern.html中阅读了它的文档。但它似乎不像我预期的那样工作。这是我的代码/models/concerns/current_user.rb

require 'active_support/concern'

module CurrentUser
  extend ActiveSupport::Concern

  module ClassMethods
    def accessor_current_user
      attr_accessor :current_user
    end
  end

end

class ActiveRecord::Base
  include CurrentUser
end

您可能注意到我的代码的最后 3 行,那是因为我希望我的所有模型都可以调用该方法,我认为这可能是实现这一目标的好方法。但是当我启动 Rails 服务器时,它就是无法调用该accessor_current_user方法。所以我对此感到困惑。我真的不知道原因。希望可以有人帮帮我。:)


更新!最后,我发现这可能是在初始化程序折叠中创建一个ActiveRecord::Base类的好方法,然后在类中包含 CurrentUser。

4

2 回答 2

1

尝试:

require 'active_support/concern'

module CurrentUser
  extend ActiveSupport::Concern

  included do
    attr_accessor :current_user
  end

  module ClassMethods
  end

end

class ActiveRecord::Base
  include CurrentUser
end

然后你应该能够做这样的事情:

foo = Foo.new
foo.current_user

在哪里Foo

class Foo < ActiveRecord:Base
  include CurrentUser
end
于 2013-08-13T10:50:42.943 回答
0

您调用 accessor_current_user 的方式是错误的。这样您就可以调用ActiveRecord::Base.accessor_current_user方法,它将执行代码而不会出现任何错误。然后你可以打电话

ar = ActiveRecord::Base.new
ar.current_user = "foo"
ar.current_user # this will return 'foo'

但是使用 ActiveSupport::Concern 实现 attr_accessor 的正确方法是

module CurrentUser
  extend ActiveSupport::Concern

  included do
    attr_accessor :current_user
  end

end

如果您在 Rails 中编写代码,则不需要require 'active_support/concern'. 请参考http://blog.neerajk.com/articles/2014-11-26-is-active-support-concern-really-another-concern/

于 2014-12-24T12:24:33.117 回答