Chúng tôi vừa tạo một tệp mới trong 'lib' đã sinh ra một loạt các cơn đau đầu liên quan đến lỗi tải.Hành vi "LoadError" không khớp với 'lib' không gian tên/tự động tải
/lib/response_set.rb:
module MyCompany
class ResponseSet < Array
...
end
end
/spec/lib/response_set_spec.rb
require 'spec_helper'
describe MyCompany::ResponseSet do
describe "..." do
...
end
end
Chạy spec này trong rspec cho chúng ta được lỗi sau khi nó được cho là người đầu tiên ' mô tả ':
/Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:492:in `load_missing_constant': Expected /Users/my_stuff/projects/my_project/lib/response_set.rb to define ResponseSet (LoadError)
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:183:in `block in const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `each'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/backward_compatibility.rb:20:in `const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-expectations-2.5.0/lib/rspec/expectations/backward_compatibility.rb:6:in `const_missing'
from /Users/my_stuff/projects/my_project/spec/lib/response_set_spec.rb:4:in `<top (required)>'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/configuration.rb:386:in `load'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/configuration.rb:386:in `block in load_spec_files'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/configuration.rb:386:in `map'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/configuration.rb:386:in `load_spec_files'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/command_line.rb:18:in `run'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/runner.rb:55:in `run_in_process'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/runner.rb:46:in `run'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/rspec-core-2.5.1/lib/rspec/core/runner.rb:10:in `block in autorun'
HOWEVER! Chúng tôi đã sử dụng nhiều tệp khác trong một thời gian dài có cấu trúc giống nhau. Ví dụ, đây là một số khác đã được làm việc tốt vì nó được tạo ra:
/lib/smart_set.rb
module MyCompany
class SmartSet < Array
...
end
end
Và /spec/lib/smart_set_spec.rb
require 'spec_helper'
describe MyCompany::SmartSet do
describe "..." do
...
end
end
này tập tin có cấu trúc giống nhau nhưng không gây ra vấn đề gì cả.
ResponseSet (lớp sự cố) dường như có vấn đề về tải không có lý do rõ ràng. Trong đường ray giao diện điều khiển, lần đầu tiên tôi cố gắng tạo ra một, tôi nhận được một lỗi, nhưng sau đó tôi có thể tạo một sau:
Loading development environment (Rails 3.0.4)
ruby-1.9.2-p136 :001 > rs = MyCompany::ResponseSet.new
LoadError: Expected /Users/my_stuff/projects/my_project/lib/response_set.rb to define ResponseSet
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:492:in `load_missing_constant'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:183:in `block in const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `each'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:503:in `load_missing_constant'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:183:in `block in const_missing'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `each'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/activesupport-3.0.4/lib/active_support/dependencies.rb:181:in `const_missing'
from (irb):1
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/railties-3.0.4/lib/rails/commands/console.rb:44:in `start'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/railties-3.0.4/lib/rails/commands/console.rb:8:in `start'
from /Users/my_stuff/.rvm/gems/[email protected]_project/gems/railties-3.0.4/lib/rails/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
ruby-1.9.2-p136 :002 > rs = MyCompany::ResponseSet.new
=> []
Ngoài ra, thêm
require 'response_set'
ở đầu response_set_spec. rb cho phép những thử nghiệm đó chạy. Nhưng không có điều đó là cần thiết cho smart_set_spec.rb.
Sau đây được đặt ra trong application.rb:
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
config.autoload_paths += Dir["#{config.root}/app/models/**/"]
Bây giờ, tôi hiểu rằng Rails có một số loại ý kiến về cách cấu trúc tập tin phải phù hợp với cấu trúc không gian tên cho các loại của sự vật, và chúng tôi đã cơ cấu lại các mô-đun và tệp của chúng tôi hướng tới mục tiêu này. SEEMS đã khắc phục vấn đề (mặc dù chúng tôi đã nhìn thấy một số lỗi tải lạ khác trong một thời gian khi chúng tôi chạy bộ kiểm tra đầy đủ - những điều này đã biến mất một cách bí ẩn). Tuy nhiên, tất cả mọi người ở đây đều bối rối và không có chút khó chịu khi Rails quá mâu thuẫn và chúng tôi muốn biết tại sao. Như bạn có thể thấy có hai tệp giống hệt như cách sắp xếp tên tệp và cấu trúc tệp có liên quan, được xử lý hoàn toàn khác nhau. Trong thực tế, chúng tôi có khoảng một chục tệp khác ở cấp cao nhất của 'lib' với các không gian tên tương tự mà chưa bao giờ gây ra bất kỳ vấn đề nào. Bất cứ ai có thể giải thích những gì heck đang xảy ra ở đây?
Cảm ơn bạn Alexey. Điều đó có vẻ đáng ngờ. Dường như với tôi rằng việc nâng cao ngoại lệ phụ thuộc vào thời tiết 'require_or_load' đã thành công. Nhưng sau đó một lần nữa tôi không phải rất quen thuộc với mê cung đó là Rails can đảm. –
@Nick, dường như ngoại lệ được nâng lên khi, sau khi tải tệp, hằng số vẫn không được xác định. Trong trường hợp của bạn, có vẻ như tập tin được dự kiến sẽ xác định 'ResponseSet' trong khi nó định nghĩa' MyCompany :: ResponseSet' (đây là cách nó trông với tôi, nhưng tôi không phải là một chuyên gia). Sự mâu thuẫn là điều kỳ lạ nhất. Bạn có chắc chắn rằng bạn đã không đơn giản hóa vấn đề ban đầu? Có lẽ 'MyCompany :: SmartSet' nằm trong'/lib/my_company/smart_set.rb' và không chỉ '/ lib/smart_set.rb'? Tôi đã gửi một [báo cáo lỗi tại GitHub] (https://github.com/rails/rails/issues/2572) về một vấn đề tương tự. – Alexey
Không. Các cấu trúc tệp giống hệt nhau. Chúng tôi đã dành một vài giờ kiểm tra mọi sự khác biệt có thể chúng tôi có thể nghĩ đến. Sự khác biệt duy nhất là với việc thực hiện thực tế của mỗi lớp (tức là thuộc tính và phương pháp) nhưng không có điều nào trong số đó sẽ ảnh hưởng đến cách các tệp được tải! –