Я думаю, вы поступаете неправильно. Во-первых, зачем вам использовать именованную область? Разве это просто сделать?
class BatchRecord < ActiveRecord::Base
belongs_to :user
def current_user
self.user.class.current_user
end
end
В этом случае тестирование будет тривиальным. НО! WTF вы определяете current_user
как атрибут класса? Теперь, когда Rails 2.2 является «потокобезопасным», что произойдет, если вы запустите приложение в двух отдельных потоках? Один пользователь войдет в систему, установив current_user
для ВСЕХ User
экземпляров. Теперь другой пользователь с правами администратора входит в систему и current_user
переключается на свой экземпляр. Когда первый пользователь перейдет на следующую страницу, он / она получит доступ к учетной записи других лиц с правами администратора! Шок! Ужас!
В этом случае я рекомендую либо создать новый метод контроллера current_user
, который возвращает экземпляр пользователя текущего пользователя. Вы также можете сделать еще один шаг и создать модель оболочки, например:
class CurrentUser
attr_reader :user, :session
def initialize(user, session)
@user, @session = user, session
end
def authenticated?
...
end
def method_missing(*args)
user.send(*args) if authenticated?
end
end
О, и, кстати, теперь я снова смотрю на ваш вопрос, возможно, одна из причин, по которой он не работает, состоит в том, что строка User.current_user && User.current_user.id
вернет логическое значение, а не целое число, которое вы хотите . РЕДАКТИРОВАТЬ Я идиот.
Именованная область видимости - это абсолютно неправильный способ сделать это. Именованная область действия предназначена для возврата коллекций, а не отдельных записей (что является еще одной причиной, по которой это не удается). Это также делает ненужный вызов БД, в результате чего вам не нужен запрос.