我对mixin模块中的常量作用域有点问题.假设我有这样的东西

module Auth

  USER_KEY = "user" unless defined? USER_KEY

  def authorize
    user_id = session[USER_KEY]
  def

end

除非已经定义,否则USER_KEY常量应该默认为"USER".现在我可能会把它混合到几个地方,但在其中一个地方,用户密钥需要不同,所以我们可能会有这样的东西

class ApplicationController < ActionController::Base

  USER_KEY = "my_user"

  include Auth

  def test_auth
    authorize
  end

end

我希望USER_KEY在authorize中使用时是"my_USER",因为它已经被定义了,但它仍然是"USER",取自USER_KEY的模块定义.有人知道如何授权使用用户密钥的类版本吗?

推荐答案

你在Auth中申报的USER_KEY个(甚至是有条件的)在全局被称为Auth::USER_KEY.虽然include modules can以非完全限定的方式引用密钥,但它不会"混入"到包含模块中.

如果您希望每个包含模块(例如ApplicationController)能够定义自己的USER_KEY,请try 以下方法:

module Auth
  DEFAULT_USER_KEY = 'user'
  def self.included(base)
    unless base.const_defined?(:USER_KEY)
      base.const_set :USER_KEY, Auth::DEFAULT_USER_KEY
    end
  end
  def authorize
    user_id = session[self.class.const_get(:USER_KEY)]
  end
end

class ApplicationController < ActionController::Base
  USER_KEY = 'my_user'
  include Auth
end

不过,如果你要遇到这些麻烦,不妨把它变成一个类方法:

module Auth
  DEFAULT_USER_KEY = 'user'
  def self.included(base)
    base.extend Auth::ClassMethods
    base.send :include, Auth::InstanceMethods
  end
  module ClassMethods
    def user_key
      Auth::DEFAULT_USER_KEY
    end
  end
  module InstanceMethods
    def authorize
      user_id = session[self.class.user_key]
    end
  end
end

class ApplicationController < ActionController::Base
  def self.user_key
    'my_user'
  end
end

或类级访问器:

module Auth
  DEFAULT_USER_KEY = 'user'
  def self.included(base)
    base.send :attr_accessor :user_key unless base.respond_to?(:user_key=)
    base.user_key ||= Auth::DEFAULT_USER_KEY
  end
  def authorize
    user_id = session[self.class.user_key]
  end
end

class ApplicationController < ActionController::Base
  include Auth
  self.user_key = 'my_user'
end

Ruby-on-rails相关问答推荐

Rails 7.1解决冲突的Zeitwerk Inflection规则

有什么办法能把这写清楚吗?

对Rails进行枚举不允许空值

Rails7--如何使用内联代码仅为操作运行BEFORE操作

使用Rails和RSpec,有没有办法查看操作真正将您带到哪个页面?

如何在哪里查询 Rails 模型中定义的方法

BigDecimals 的总和最终成为整数 [Ruby on Rails]

在单个继承表和另一个表中的类之间建立多对多关联

Rails 将字符串与视图中的变量连接的最佳方法

如何在 rails 中指定和验证枚举?

可能在rails中有多态has_one关系?

如何独立测试模型的回调方法?

如何将变量传递给render_to_string?

如何让空白复选框作为假传递给参数

Rails 3. 构建 oauth2 提供程序

Rails 5.1:未知 firstpos:NilClass - 问题重新加载应用程序

为什么 respond_with 被从 rails 4.2 移除到它自己的 gem 中?

如何在rails中异步加载部分页面

如何仅使用 PostgreSQL 创建简单的模糊搜索?

测试和规格有什么区别?