Bagaimana cara membuat dan menggunakan modul menggunakan Ruby on Rails 3?

90

Saya menggunakan Ruby on Rails 3 dan saya ingin memindahkan beberapa kode khusus dan bersama dalam sebuah modul.

  1. Sintaks apa yang harus saya gunakan untuk menulis kode modul?
  2. Di folder mana dari aplikasi saya, saya harus meletakkan file modul?
  3. Bagaimana saya harus memasukkan modul itu dalam satu atau lebih kelas pengontrol?
  4. Tindakan lain apa, jika ada, yang harus saya gunakan di modul kustom di mana pun dalam aplikasi saya?
  5. Bagaimana cara memanggil metode dalam modul dari aplikasi saya?

Terima kasih sebelumnya.

pengguna502052
sumber
2
Baik sekali! Saya membutuhkannya.
Arup Rakshit

Jawaban:

116

To 1. Sebuah modul dibuat / dibuka hanya dengan mengatakan:

module MyModule
  def first_module_method
  end
end

Ke 2. libFolder. Jika Anda ingin mengatur modul Anda di libfolder, Anda dapat memasukkannya ke dalam modul itu sendiri. Misalnya, jika Anda menginginkan subfolder, super_modulesmodul Anda akan ditentukan sebagai berikut:

module SuperModules
  module MyModule
    def first_module_method
    end
  end
end

Sampai 3./5. Saat menyertakan modul dalam kelas, Anda cukup memanggil metode modul seolah-olah mereka didefinisikan dalam kelas:

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

Ke 4. Pertama, pastikan bahwa modul Anda benar-benar dibutuhkan di setiap kelas aplikasi Anda. Jika tidak, masuk akal untuk hanya memasukkannya di tempat yang diperlukan agar tidak membengkak kelas yang tidak membutuhkannya. Jika Anda benar-benar ingin modul ini ada di mana-mana, termasuk melihat hierarki kelas kelas Anda di aplikasi. Apakah Anda menginginkan modul di semua model? Anda dapat membuka ActiveRecord :: Base dan menambahkan modul Anda di sana.

Stephan
sumber
2
Untuk mengatur file, dapatkah saya membuat sub-folder di folder 'lib'? Jika ya, apa yang berubah?
pengguna502052
2
@ user502052 Saya telah mengupdate jawaban poin 2 untuk menjawab pertanyaan itu.
Stephan
3
Banyak hal yang tidak jelas di sini. Nama file apa yang akan diberikan? Bagaimana memanggil metode jika tidak menyertakan semua modul? Saya tidak percaya ada begitu banyak suara positif karena saya masih tidak tahu cara menggunakan modul di akhir.
Augustin Riedinger
5
Setelah Anda membuat modul seperti di atas dengan memasukkan dalam libfolder, catatan penting adalah untuk memungkinkan Rails3 tanda komentar pada baris dalam config\application.rbuntuk config.autoload_paths- baca misalnya, stackoverflow.com/questions/1073076/rails-lib-modules-and ... Catatan juga bahwa Anda harus berhati-hati dalam menggunakan nama file untuk modul Anda yang cocok dengan nama modul itu sendiri. Jadi jika Anda menyimpannya lib/test/my_module.rb, Anda harus include Test::MyModule- untuk lebih jelasnya lihat stackoverflow.com/questions/4073856/rails-3-autoload
sameers
6
Saya baru saja menemukan jawaban lama saya ini. :( Saya ingin downvote. Jangan taruh apa pun di lib! Masukkan kode Anda (termasuk modul tambahan) app/modelsjika kode memerlukan akses ke model lain. Jika kode Anda benar-benar 'perpustakaan' dan bisa ada sendiri, saya menyarankan untuk menjual permata. Sebagai contoh, lihat github.com/shageman/the_next_big_thing
Stephan
3

A> 1. Anda dapat menggunakan sintaks yang sama seperti kelas ruby ​​lainnya. Misalnya, saya mendefinisikan modul VehicleClassifer yang akan menggunakan metode classify_vehicle untuk mengklasifikasikan kendaraan berdasarkan jumlah roda yang diterimanya sebagai input.

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

A> 2. Modul biasanya disimpan di folder / lib.

pertanyaan 3,4,5 memiliki jawaban yang kurang lebih sama. kamu bisa memakai

class SomeController < ApplicationController
  include VehicleClassfier

  def index 
    classify_vehicle(4)  
  end
end

di kelas Anda menggunakan modul dan Anda akan memiliki akses ke semua metode modul.

Selain itu, jika Anda perlu menggunakan modul di seluruh aplikasi Anda, Anda dapat memasukkannya ke dalam pengontrol aplikasi Anda.

Shreyas
sumber
2
Saya mencoba ini dan mendapatkan kesalahan metode yang tidak ditentukan. Tahu apa yang saya lakukan salah?
Tony
Apakah Anda yakin modul Anda dapat diakses? stackoverflow.com/questions/6604272/… mungkin membantu Anda?
Shreyas
1
@Tony - Anda mungkin perlu me-restart server Anda - bahkan dalam dev-mode, agar metode modul tersedia. Dan setiap kali Anda mengubah kode di modul Anda, Anda harus merestart server lagi. Misalnya, jika ada kesalahan, atau akan ada kesalahan pada kode lama, tetapi sorot kode baru pada baris itu di pesan kesalahan - sangat membingungkan.
JosephK
Ada ide bagaimana memasukkan dan menggunakan modul kustom di dalamnya ApplicationHelper?
WM