我很確定我錯過了一個基本的錯誤,所以我希望另一組眼睛可能會有所幫助。我正在使用Rails 3,Ruby 1.9.2和Rspec 2.RSpec中的動態define_method拋出錯誤
我想在模型上定義動態類方法,以便在添加到可分配對象(如帳戶)時返回基本角色系統。例如:
BaseRole.creator_for_account
一切通過控制檯正常工作:
ruby-1.9.2-p180 :003 > BaseRole.respond_to?(:creator_for_account)
=> true
但是當我跑我的規格對於任何類的方法,我得到一個NoMethodError
無論我呼籲在規範的方法。我假設我是如何動態聲明方法的東西不是用RSpec拼湊出來的,但我似乎無法弄清楚爲什麼。
lib目錄是自動加載路徑,並且這些方法對respond_to?返回true。
# /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
如果您刪除模塊,它仍然是一個問題?我也在類文件中使用define_method來獲得這個,只有在guard後面使用rspec。 – 2013-11-23 05:37:29