2010-09-23 31 views
13

Tôi có một mô hình yêu cầu tải dữ liệu ngoài từ một nguồn phụ trợ. Một số dịch vụ web tồn tại mà mô hình của tôi có thể lấy dữ liệu từ (có thể hoán đổi), nhưng tôi không muốn tạo mã sẽ làm cho việc thay đổi dịch vụ trở nên khó khăn (chi phí đáng kể dựa trên mức sử dụng biến và cố định và có thể thay đổi sẽ được yêu cầu).Mô hình Sử dụng Mô-đun trong Ứng dụng Đường ray

Tôi muốn tạo trình điều khiển để thực hiện tương tác (và sau đó tạo thêm các trình điều khiển tùy chỉnh nếu dịch vụ yêu cầu chuyển đổi). Thật không may, do sự kết nối chặt chẽ của người lái và mô hình, nó không có ý nghĩa để trích xuất các mã vào một plugin hoặc đá quý. Tôi đã trích xuất tất cả các mã vào một mô-đun (xem ví dụ), và hiện đang có mã được khai báo trên mô hình của tôi.

module Synchronize 
    def refresh 
    self.attributes = ... 
    self.save 
    end 
end 

class Data < ActiveRecord::Base 
    include Synchronize 
end 

Rails (3.0.0) có quy ước lưu trữ mô-đun kết hợp chặt chẽ với mô hình không? Tôi có nên sử dụng plugin để làm điều này không? Liên kết này có được liên kết với thư mục 'ứng dụng/người trợ giúp' không? Nếu không, đâu là nơi thích hợp nhất để lưu trữ mã? Cảm ơn!

Trả lời

27

Bạn đúng rằng nếu mô-đun được kết hợp chặt chẽ với mô hình cụ thể đó thì đó không phải là ứng cử viên tốt cho gem/plugin.

ứng dụng/người trợ giúp/là dành cho các phương pháp trợ giúp xem và không được chứa các mô-đun chỉ để trộn vào các mô hình.

Một nơi bạn có thể đặt mô-đun nằm trong lib /. Đây là mã không thực sự phù hợp với bất kỳ đâu trong ứng dụng/và thường là ngôi nhà ban đầu của mã được ghép nối lỏng lẻo trước khi nó được chuyển sang một plugin (nhưng đó không phải là quy tắc cứng và nhanh). Tuy nhiên, vì mô-đun của bạn được kết hợp chặt chẽ với mô hình của bạn, lib/có thể không phải là nơi tốt nhất cho mô-đun đó.

Tôi biết rằng 37 ký hiệu (và những người khác) sử dụng khái niệm 'mối quan tâm' như một cách để giữ mã mô hình liên quan được tổ chức theo mô-đun. Điều này được thực hiện bằng cách tạo ứng dụng/mối quan tâm/và đặt các mô-đun trong đó. sau đó thư mục đó sẽ được thêm vào con đường tải của ứng dụng trong config/application.rb (config/environment.rb cho Rails 2) với:

config.load_paths += %W(#{Rails.root}/app/concerns) 

Các module sau đó có thể được trộn lẫn vào mô hình như bình thường.

Dưới đây là các bài đăng blog ban đầu về vấn đề này bởi Jamis Buck - http://weblog.jamisbuck.org/2007/1/17/concerns-in-activerecord

Một biến thể của này mà cá nhân tôi thích, mặc dù nó không liên quan đến mô-đun, sử dụng plugin này: http://github.com/jakehow/concerned_with

Hy vọng rằng sẽ giúp .

3

Liên kết này đã giúp tôi giải quyết vấn đề này.

http://ander.heroku.com/2010/12/14/concerns-in-rails-3/

Tôi đã gắn bó với nó trong một mô hình/extensions thư mục. Thư mục quan tâm có ý nghĩa nhưng từ 'mối quan tâm' không cảm thấy rõ ràng với tôi. Có lẽ nó sẽ phát triển trên tôi.

Tôi cũng đã thêm con đường mở rộng trong application.rb

config.autoload_paths += %W(#{config.root}/app/models/extensions) 
Các vấn đề liên quan