2011-09-01 29 views
6

Tôi đang nâng cấp từ đường ray 3.0.7 lên 3.1 và gặp sự cố khi thử nghiệm của mình để vượt qua. Vấn đề xảy ra khi tôi cố gắng sử dụng một đối tượng tài nguyên đang hoạt động được stubbed trong một nhà máy.đường ray 3.1.0 thuộc về ActiveResource không còn hoạt động

#employee.rb 
class Employee < ActiveResource::Base; end 

#task.rb 
class Task < ActiveRecord::Base 
    belongs_to :employee 
end 

#factories.rb 
Factory.define :employee do |e| 
    e.name "name" 
end 

Factory.define :task do |t| 
    t.employee { Factory.stub(:employee) } 
end 

Trên bảng điều khiển và trong thông số kỹ thuật, nhân viên làm việc. Việc tham chiếu đối tượng nhân viên được stubbed trong một nhiệm vụ mới sẽ đưa ra lỗi sau.

Factory.create(:task, :employee => Factory.stub(:employee)) 

NoMethodError: 
    undefined method `[]' for #<Employee:0x007fc06b1c7798> 

EDIT

Đây không phải là một vấn đề nhà máy cô gái. Tôi nhận được cùng một lỗi nếu tôi làm như sau trong giao diện điều khiển.

Task.new(:employee => Employee.first) 

Nó phải liên quan đến cách thức_để ánh xạ cột id.

+0

Vui lòng thêm câu trả lời và đánh dấu câu trả lời là câu trả lời đúng. Cảm ơn bạn đã đăng bài này. – WattsInABox

Trả lời

5

Tôi không thích các bản vá khỉ vì vậy tôi đã tạo ra một mô-đun mà tôi sẽ bao gồm ít khởi để mở rộng ActiveRecord

module BelongsToActiveResource 

    def self.included(base) 
     base.extend(ClassMethods) 
    end 

    module ClassMethods 

    def ar_belongs_to(name, options = {}) 
     class_eval %(
     def #{name} 
      @#{name} ||= #{options[:class_name] || name.to_s.classify }.find(#{options[:foreign_key] || name.to_s + "_id" }) 
     end 

     def #{name}=(obj) 
      @#{name} ||= obj 
      self.#{ options[:foreign_key] || name.to_s + "_id" } = @#{name}.#{ options[:primary_key ] || 'id' } 
     end 
    ) 
    end 

    end 

end 

ActiveRecord::Base.class_eval { include BelongsToActiveResource } 

Sau đó, trong mỗi mô hình ActiveRecord sẽ trông như thế:

#task.rb 
class Task < ActiveRecord::Base 
    ar_belongs_to :employee 
end 

Hope điều này giúp ai đó

Các vấn đề liên quan