Ruby on Rails 3 kullanarak bir modül nasıl oluşturulur ve kullanılır?


90

Ruby on Rails 3 kullanıyorum ve bazı özel ve paylaşılan kodları bir modülde taşımak istiyorum.

  1. Modül kodunu yazmak için hangi sözdizimini kullanmalıyım?
  2. Modül dosyasını uygulamamın hangi klasörüne yerleştirmeliyim?
  3. Bu modülü bir veya daha fazla denetleyici sınıfına nasıl dahil etmeliyim?
  4. Özel modülü uygulamamın herhangi bir yerinde kullanmak zorunda olduğum başka ne eylem var?
  5. Modüldeki yöntemleri uygulamamdan nasıl çağırabilirim?

Şimdiden teşekkürler.


2
Çok iyi! Ona ihtiyacım vardı.
Arup Rakshit

Yanıtlar:


116

1. Bir modül basitçe söylenerek oluşturulur / açılır:

module MyModule
  def first_module_method
  end
end

libKlasöre 2. Klasör. Modüllerinizi libklasörde düzenlemek istiyorsanız, onları modüllerin içine koyabilirsiniz. Örneğin, bir alt klasör super_modulesistiyorsanız, modülleriniz aşağıdaki gibi tanımlanacaktır:

module SuperModules
  module MyModule
    def first_module_method
    end
  end
end

3./5. Modülü bir sınıfa dahil ederken, modül yöntemlerini sınıf içinde tanımlanmış gibi çağırabilirsiniz:

class MyClass
  include MyModule
  def some_method
    first_module_method #calls module method
  end
end

4. İlk olarak, uygulamanızın her sınıfında modülünüzün gerçekten gerekli olduğundan emin olun. Değilse, zaten ihtiyaç duymayan sınıfları şişirmemesi için yalnızca ihtiyaç duyulan yere dahil etmek mantıklıdır. Modülü her yerde gerçekten istiyorsanız, uygulamadaki sınıflarınızın sınıf hiyerarşisine bakın. Tüm modellerde modülü istiyor musunuz? ActiveRecord :: Base'i açabilir ve modülünüzü oraya ekleyebilirsiniz.


2
Dosyaları düzenlemek için 'lib' klasöründe bir alt klasör oluşturabilir miyim? Öyleyse ne değişiyor?
user502052

2
@ user502052 Bu soruyu cevaplamak için 2. maddeye verilen cevabı güncelledim.
Stephan

3
Burada pek çok şey belirsizdir. Hangi dosya isimleri verilecek? Tüm modülü içermeyen yöntemler nasıl çağrılır? Sonunda bir modülü nasıl kullanacağımı hala bilmediğim için bu kadar çok oy olduğuna inanamıyorum.
Augustin Riedinger

5
Eğer bunu dahil ederek yukarıdaki gibi bir modül oluşturduktan sonra libklasör önemli bir not içinde satırın başındaki için raylar 3. sağlamaktır config\application.rbiçin config.autoload_paths- örneğin okuma, stackoverflow.com/questions/1073076/rails-lib-modules-and ... Not ayrıca modülünüz için modül adıyla eşleşen bir dosya adı kullanmaya dikkat etmeniz gerektiğine de dikkat edin. Bunu tasarruf Yani eğer lib/test/my_module.rbiçin, kişide include Test::MyModuledaha fazla ayrıntı için - stackoverflow.com/questions/4073856/rails-3-autoload
sameers

6
Bu eski cevabımı yeni buldum. :( Olumsuz oy vermek istiyorum. Kitaplığa hiçbir şey koymayın! Kodun app/modelsdiğer modellere erişmesi gerekiyorsa , kodunuzu (ek modüller dahil) koyun. Kodunuz gerçekten bir 'kitaplık' ise ve kendi başına varolabiliyorsa, ben bir mücevher satmayı önerin
Stephan

3

A> 1. Diğer herhangi bir Ruby sınıfıyla aynı sözdizimini kullanabilirsiniz. Örneğin, bir aracı girdi olarak aldığı tekerlek sayısına göre sınıflandırmak için classify_vehicle yöntemini kullanacak bir VehicleClassifer modülü tanımlıyorum.

module VehicleClassifer
  def classify_vehicle(number_of_wheels)
    VehicleType.where("number_of_wheels = ?", number_of_wheels)
  end
end

A> 2. Modüller genellikle / lib klasöründe saklanır.

sorular 3,4,5 aşağı yukarı aynı cevaba sahiptir. kullanabilirsiniz

class SomeController < ApplicationController
  include VehicleClassfier

  def index 
    classify_vehicle(4)  
  end
end

sınıfta modülü kullandığınız ve modülün tüm yöntemlerine erişebileceksiniz.

Ayrıca, uygulamanız üzerinden bir modül kullanmanız gerekirse, bunu uygulama denetleyicinize dahil edebilirsiniz.


2
Bunu denedim ve tanımlanmamış bir yöntem hatası aldım. Neyi yanlış yaptığıma dair bir fikrin var mı?
Tony

Modülünüzün erişilebilir olduğundan emin misiniz? stackoverflow.com/questions/6604272/… size yardımcı olabilir mi?
Shreyas

1
@Tony - Modül yöntemlerinin kullanılabilir olmasını sağlamak için, dev modunda bile sunucunuzu yeniden başlatmanız gerekebilir. Ve modülünüzdeki kodu her değiştirdiğinizde, sunucuyu yeniden başlatmanız gerekir. Örneğin, bir hata varsa veya eski kodda hata verirse, ancak hata mesajında ​​o satırdaki yeni kodu vurgulayın - çok kafa karıştırıcı.
JosephK

Bu özel modülleri nasıl dahil edeceğiniz ve kullanacağınız hakkında bir fikriniz var ApplicationHelpermı?
WM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.