我注意到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。
答案 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/