Как получить текущий экземпляр модуля в Ruby - PullRequest
1 голос
/ 11 января 2011

Это название на самом деле не объясняет все, так что здесь идет. У меня есть два движка Rails, которые разделяют некоторые функции (например, модель пользователя и аутентификация). У меня есть базовый класс 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 голосов
/ 11 января 2011

Хотя я бы предостерег вас, чтобы найти лучший, менее хакерский способ сделать это, вот как вы могли бы сделать это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...