2010-09-23 25 views
13

Yardımcı bir kaynaktan harici veri yüklemeyi gerektiren bir modelim var. Modelimin verileri (takas edilebilir) üzerinden alabildiği bir dizi web hizmeti var, ancak hizmetleri değiştirmeyi zorlaştıracak bir kod oluşturmak istemiyorum (maliyetler değişken ve sabit kullanıma göre önemli ölçüde farklılık gösterir ve muhtemelen değişiyor) Gerekli olacak).Raylar İçinde Modül Kullanma Model Uygulama

Etkileşimi gerçekleştirmek için bir sürücü oluşturmak (ve hizmetin değiştirilmesi gerekirse daha fazla özel sürücü oluşturmak) oluşturmak istiyorum. Ne yazık ki, sürücü ve modelin sıkı bir şekilde birleşmesinden dolayı, kodun bir eklenti veya mücevher halinde çıkarılması mantıklı değildir. Tüm kodu bir modüle aldım (örneğe bakın) ve şu anda modelimin üstünde bildirilen kod var. (3.0.0)

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

class Data < ActiveRecord::Base 
    include Synchronize 
end 

mu Raylar sıkıca modelleri ile birleştiğinde modülleri depolamak için bir kongre var? Bunu yapmak için bir eklenti kullanmalı mıyım? Bu 'app/helpers' dizini ile ilişkili mi? Değilse, kodu depolamak için en uygun yer neresidir? Teşekkürler!

cevap

27

Modül, bu modele sıkı sıkıya bağlıysa, o zaman bir mücevher/eklenti için iyi bir aday değildir.

app/helpers/help yardımcı yöntemleri içindir ve yalnızca modellere karışmak için kullanılan modülleri içermemelidir.

Modülü koyabileceğiniz yerlerden biri lib /. Bu, uygulama içinde herhangi bir yere sığmayan kodlar içindir ve genellikle bir eklentiye taşınmadan önce gevşek bir şekilde bağlanmış kodun başlangıç ​​evidir (ancak bu zor ve hızlı bir kural değildir). Ancak, modülünüz modelinize sıkıca bağlı olduğundan, lib/bunun için en iyi yer olmayabilir.

37signals'ın (ve diğerlerinin) modüller halinde düzenlenmiş ilgili model kodunu tutmanın bir yolu olarak 'endişeler' kavramını kullandığını biliyorum. Bu, uygulama/kaygılar yaratıp/modülleri buraya koyarak gerçekleştirilir. Bu dizin yerine yapılandırma/application.rb uygulamanın yük yolu için ilave edilir (Raylar için yapılandırma/environment.rb 2) ile:

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

modülü daha sonra normal olarak modele karıştırılabilir. http://github.com/jakehow/concerned_with

Umut yardımcı olur: -

İşte Jamis Buck tarafından bu konuda özgün blog yazısı var http://weblog.jamisbuck.org/2007/1/17/concerns-in-activerecord

o modülleri içermez rağmen ben şahsen tercih Bunun başka varyasyonu, bu eklentiyi kullanan .

3

Bu bağlantı beni bu konuda yardımcı oldu.

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

manken/uzantıları dizine yapışmasını edilmiştir. Endişeler dizini anlamlıdır, ancak 'endişeler' kelimesi benim için açık değildir. Belki bana büyür.

Ben de application.rb uzantıları yolunu eklendi

config.autoload_paths += %W(#{config.root}/app/models/extensions) 
İlgili konular