Я почти уверен, что здесь упущена основная ошибка, поэтому я надеюсь, что другой набор глаз может помочь. Я использую Rails 3, Ruby 1.9.2 и Rspec 2.
Я хотел бы определить методы динамического класса в модели, чтобы можно было возвращать базовые роли для назначаемого объекта (например, учетной записи) по мере их добавления в систему. Например:
BaseRole.creator_for_account
Все отлично работает через консоль:
ruby-1.9.2-p180 :003 > BaseRole.respond_to?(:creator_for_account)
=> true
но когда я запускаю свои спецификации для любого из методов класса, я получаю NoMethodError
везде, где я вызываю метод в спецификации. Я предполагаю, что что-то в том, как я динамически объявляю методы, не зависит от RSpec, но я не могу понять, почему.
lib dir - это путь к автозагрузке, и методы возвращают true для response_to?.
# /lib/assignable_base_role.rb
module AssignableBaseRole
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
BaseRole.all.each do |base_role|
role_type = RoleType.find(base_role.role_type_id)
assignable_name = base_role.assignable_type.downcase
method = "#{role_type.name}_for_#{assignable_name}"
define_method(method) do
self.where(:role_type_id => role_type.id,
:assignable_type => assignable_name).first
end
end
end
end
Затем включите модуль в BaseRole
# /models/base_role.rb
class BaseRole < ActiveRecord::Base
include AssignableBaseRole
belongs_to :role
belongs_to :role_type
......
......
end
Тогда в моей спецификации:
it "adds correct authority for creator role" do
create_assignment
base_role = BaseRole.creator_for_account # <== NoMethodError here
user1 = Factory.create(:user)
account.users << user1
user1.roles_for_assignable(account).should include(base_role.role)
end