10

Bir Rails 3 uygulamasından bir Gem'e gömülü bir sınıfı genişletmek istesem sınıf davranışını class_eval ve modüllerle (miras yoluyla değil) genişletmenin yolu nedir? Raylar 3'te Gemiler Sınıflarını (class_eval ve Modüller aracılığıyla) Nasıl/Ne Zaman/Nerede Uzatabilirim?

bir örnek

şudur:

Ben etiketleri ve kategoriler için kalıcı bağlantı oluşturma yeteneği eklemek istediğiniz

(ActsAsTaggableOn ve ActsAsCategory taşlar aracılığıyla).

Tag ve Category modellerini tanımlamışlardır.

Temelde bunu yapmak istiyorum:

Category.class_eval do 
    has_friendly_id :title 
end 

Tag.class_eval do 
    has_friendly_id :title 
end 
mücevher özgü olabilir bu özellikler ekleyen başka yolları da var olsa bile

, bir Rails 3 sınıflara davranışı eklemek için önerilen yol nedir Bunun gibi uygulama?

Configuration model ve Asset modeli gibi bunu yapmak istediğim birkaç tane daha oluşturulmuş değerli taş var. Uygulamam için app/models/configuration.rb model sınıfı oluşturmayı eklemek istiyorum ve class_eval yaptım.

Neyse, bunun nasıl çalışması gerekiyor? Şu anki Rails 3 bloglarından/docs/gistlerinden herhangi birini kapsayan bir şey bulamıyorum.

cevap

9

Ben şöyle Uzantılarınızı içeren dosyalar gerektirebilir nerede, ilk/başlatıcıları yapılandırma için bir dosya eklemek bunu:

Sonra
# config/initializers/extensions.rb 
require "#{Rails.root}/app/models/category.rb" 
require "#{Rails.root}/app/models/tag.rb" 

sadece sınıfları yeniden açıp ekleyebilir başka türlü gerekir:

# app/models/category.rb 
class Category 
    has_friendly_id :title 
end 

Sadece olumsuz sunucu etkisi, yani üstesinden gelecek daha iyi bir yolu olup olmadığından emin değil almaya bu dosyaların herhangi bir değişiklik için yeniden başlatılması olmasıdır. https://github.com/atd/rails_engine_decorators

Sadece Gemfile ekleyin:

+0

Aynı konuyu ele alıyorum 'LoadError: Tag. – MhdSyrwan

+0

'u tanımlamak için LoadError: Beklenen uygulama/modeller/tag.rb:" tag.rb "dosyanızın içinde, tanımlanacak ilk sınıfın çağrılması gerektiği anlamına gelir. tam olarak "Tag", bu yüzden sadece doğru yolu isimlendirmediniz. –

0

Sen rails_engine_decorator mücevher kullanabilirsiniz

gem 'rails_engine_decorator' 

Ve kullanıcı class_eval sizin dekoratörler de: Bana uyar

/app/decorators/models/category_decorator.rb 
/app/decorators/models/tag_decorator.rb 

. Umarım faydalı bulursunuz!

İlgili konular