如何在Ruby中获取当前实例模块

时间:2011-01-11 02:50:57

标签: ruby-on-rails ruby inheritance

这个标题并没有真正解释所有内容,所以这里有。我有两个共享一些功能的Rails引擎(即用户模型和身份验证)。我有一个基类User类,然后是另外两个User类,它们从每个应用程序的基类继承,如下所示:

class User; end
class App1::User < ::User; end
class App2::User < ::User; end

我的身份验证的方法类似于以下

def user_from_session
  User.find_by_id(session[:user_id])
end

包含在我的application_controller中。我的问题是,当提取用户时......它总是使用基类User类。我真正想要的是能够获取与调用该方法的应用程序类型相同的用户。

例如,如果用户在SomeController

class App1::SomeController < ApplicationController; end

我希望application_controller中的方法提取App1,以便它实例化App1::User而不仅仅是User

这可能吗?

我不是在寻找一种涉及两种user_from_session方法的解决方案,每种方法都有一种方法。我知道如何实现它。我更感兴趣的是知道Ruby中是否可以使用这种类型的东西。

1 个答案:

答案 0 :(得分:0)

虽然我提醒你要找到一个更好,更少hacky的方法,但是你可以这样做:

def user_from_session
  # App1::Whatever::FooController -> App1::Whatever
  module_name = self.class.name.split('::')[0..-2].join('::')
  # App1::Whatever -> App1::Whatever::User
  user_class = "#{module_name}::User".constantize
  # App1::Whatever::User.find_by_id(...)
  user_class.find_by_id(session[:user_id])
end