Rails 4关注错误

时间:2013-08-13 09:35:40

标签: ruby-on-rails-4

我注意到rails4中concern的新功能,我在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。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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/