5

Tôi có một số kiểm tra khách hàng iPhone chạy trên máy chủ phát triển đường ray của tôi. Toàn bộ bộ chạy nhanh hơn nếu tôi bật bộ nhớ đệm của lớp trong cấu hình Rails. Mặt khác, điều đó làm chậm sự phát triển khi tôi không thực sự chạy thử nghiệm.Tôi có thể thay đổi config.cache_classes theo chương trình trong Rails 3 không?

Tôi muốn bộ thử nghiệm thực hiện hành động ngay từ đầu để bật bộ nhớ đệm của lớp và một hành động khác ở cuối để tắt bộ nhớ đệm của lớp một lần nữa.

Điều này có thể thực hiện được không? Nếu vậy, làm thế nào?

Trả lời

0

Tôi không nghĩ làm những gì bạn đề xuất sẽ hoạt động.

Nhưng tôi đề nghị bạn có thể đang tìm giải pháp sai.

Nếu những gì bạn muốn là truy cập cơ sở dữ liệu phát triển của bạn từ thử nghiệm iphone, thì tại sao không thêm môi trường mới.

Thêm một cấu hình tập tin mới/môi trường/iphone_dev.rb

require File.dirname(__FILE__)+"/development.rb" 
config.cache_classes = true 

Và trong database.yml của bạn (hoặc mongoid.yml hoặc bất cứ)

iphone_dev: 
    host: localhost 
    database: my_app_development 

Không có lý do không thể cơ sở dữ liệu giống nhau

Bây giờ chỉ cần chạy rails server -eiphone_dev -p3001

Bạn nên có một máy chủ, gần như giống như máy chủ dev của bạn, nhưng chạy trên một cổng khác, với bộ nhớ đệm được bật.

+0

Đó không phải là ý tưởng tồi khi có hai máy chủ chạy song song nhưng không giải quyết được vấn đề. Tôi vẫn sẽ cần phải khởi động lại máy chủ thử nghiệm mới này bất cứ khi nào tôi thực hiện thay đổi. – ilya

+0

Tôi đoán bạn có thể phải quyết định 'yêu cầu nhanh hơn với khởi động lại khó chịu' hoặc' yêu cầu chậm hơn tự động tải thay đổi ' –

+0

Vâng, đó là trường hợp hiện tại. Tôi chỉ muốn có thể bật "chế độ nhanh" trong một khoảng thời gian nhất định. – ilya

1

Không phải không có sự xâm nhập nghiêm trọng. Rails có khá nhiều rắc rối để đảm bảo các tệp của bạn được tải lại theo mọi yêu cầu (khi cache_classes=false). Giá trị của biến cache_classes cấu hình được sử dụng bởi initializers ở một số nơi không phải là ít trong số đó hạnh phúc:

  • sử dụng require để tải file ruby ​​khi cache_classes là true (có nghĩa là họ không còn nạp thêm)
  • lập callbacks phối để reaload việc áp dụng trên tất cả các yêu cầu khi cache_classesfalse

bạn không có quyền truy cập vào các giá trị của biến cache_classes, và bạn thậm chí có thể thay đổi nó nếu bạn thích:

Rails.configuration.cache_classes = true 

Tuy nhiên, điều này sẽ không ảnh hưởng đến trường hợp đường ray đang chạy dưới dạng trình khởi tạo khi giá trị đó chỉ được sử dụng một lần khi ứng dụng đường ray khởi động.

Điều này có nghĩa là gì, trừ khi bạn sẵn sàng đầu tư một số thời gian và nỗ lực tấn công nghiêm trọng bạn thực sự không thể tránh việc khởi động lại máy chủ của mình. Vì vậy, những gì bạn cần xem xét là kiểm soát quá trình khởi động lại này thông qua bộ thử nghiệm của bạn.

Ví dụ: bạn có thể thử khởi động lại rails from within rails.Điều này sẽ cho phép bạn xác định hành động mà bộ thử nghiệm của bạn có thể nhấn ngay trước khi nó bắt đầu thực hiện (để khởi động lại máy chủ ở chế độ phù hợp) và một hành động khác mà máy chủ có thể nhấn sau khi tất cả các thử nghiệm đã kết thúc, để khởi động lại mọi thứ với cache_classes bộ với những gì nó từng là. Bạn sẽ kiểm soát giá trị của các lớp bộ nhớ cache thông qua một biến môi trường like this post suggests.

Nó vẫn sẽ đòi hỏi một chút công việc để thiết lập tất cả điều này và làm cho nó để treo với nhau, nhưng điều này có lẽ là đặt cược tốt nhất của bạn nếu bạn muốn có một giải pháp 'tự động kỳ diệu'.

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