จะสร้างและใช้โมดูลโดยใช้ Ruby on Rails 3 ได้อย่างไร?


90

ฉันใช้ Ruby บน Rails 3 และต้องการย้ายโค้ดที่กำหนดเองและโค้ดที่ใช้ร่วมกันในโมดูล

  1. ฉันควรใช้ไวยากรณ์อะไรในการเขียนโค้ดโมดูล
  2. ฉันต้องวางไฟล์โมดูลไว้ในโฟลเดอร์ใดของแอปพลิเคชัน
  3. ฉันจะต้องรวมโมดูลนั้นไว้ในคลาสคอนโทรลเลอร์อย่างน้อยหนึ่งคลาสได้อย่างไร
  4. ฉันต้องใช้โมดูลแบบกำหนดเองที่ใดในแอปพลิเคชันของฉันอีกหรือไม่ถ้ามี
  5. ฉันจะเรียกเมธอดในโมดูลจากแอปพลิเคชันของฉันได้อย่างไร

ขอบคุณล่วงหน้า.


2
ดีมาก! ฉันต้องการมัน
Arup Rakshit

คำตอบ:


116

ถึง 1. โมดูลถูกสร้าง / เปิดโดยพูดว่า:

module MyModule
  def first_module_method
  end
end

ถึง 2. libโฟลเดอร์ หากคุณต้องการจัดระเบียบโมดูลของคุณในlibโฟลเดอร์คุณสามารถใส่ลงในโมดูลได้เอง ตัวอย่างเช่นหากคุณต้องการโฟลเดอร์ย่อยsuper_modulesโมดูลของคุณจะถูกกำหนดดังนี้:

module SuperModules
  module MyModule
    def first_module_method
    end
  end
end

ถึง 3./5. เมื่อรวมโมดูลไว้ในคลาสคุณสามารถเรียกใช้วิธีการของโมดูลราวกับว่ามันถูกกำหนดไว้ภายในคลาส:

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

ถึง 4. Frst ตรวจสอบให้แน่ใจว่าโมดูลของคุณจำเป็นจริงๆในทุกคลาสของแอปพลิเคชันของคุณ หากไม่เหมาะสมที่จะรวมไว้ในที่ที่จำเป็นเท่านั้นเพื่อไม่ให้ขยายชั้นเรียนที่ไม่ต้องการอีกต่อไป หากคุณต้องการโมดูลทุกที่จริงๆให้ดูที่ลำดับชั้นของชั้นเรียนของคุณในแอป คุณต้องการโมดูลในทุกรุ่นหรือไม่? คุณสามารถเปิด ActiveRecord :: Base และเพิ่มโมดูลของคุณได้ที่นั่น


2
ในการสร้างไฟล์ organiza ฉันสามารถสร้างโฟลเดอร์ย่อยในโฟลเดอร์ 'lib' ได้หรือไม่? ถ้าเป็นเช่นนั้นจะมีการเปลี่ยนแปลงอย่างไร
user502052

2
@ user502052 ฉันได้อัปเดตคำตอบของข้อ 2 เพื่อตอบคำถามนั้น
Stephan

3
หลายสิ่งไม่ชัดเจนที่นี่ จะให้ชื่อไฟล์อะไร จะเรียกเมธอดอย่างไรเมื่อไม่รวมโมดูลทั้งหมด? ฉันไม่อยากเชื่อเลยว่าจะมีการโหวตเพิ่มขึ้นมากมายเพราะฉันยังไม่รู้วิธีใช้โมดูลในตอนท้าย
Augustin Riedinger

5
เมื่อคุณสร้างโมดูลตามด้านบนโดยรวมไว้ในlibโฟลเดอร์ข้อควรทราบที่สำคัญคือการเปิดใช้งาน Rails3 เพื่อยกเลิกการใส่เครื่องหมายในบรรทัดconfig\application.rbสำหรับconfig.autoload_paths- อ่านเช่นstackoverflow.com/questions/1073076/rails-lib-modules-and ... หมายเหตุ นอกจากนี้คุณต้องระมัดระวังในการใช้ชื่อไฟล์สำหรับโมดูลของคุณที่ตรงกับชื่อโมดูล ดังนั้นหากคุณบันทึกไว้lib/test/my_module.rbคุณต้องinclude Test::MyModule- ดูรายละเอียดเพิ่มเติมได้ที่stackoverflow.com/questions/4073856/rails-3-autoload
sameers

6
ฉันเพิ่งพบคำตอบเก่า ๆ ของฉัน :( ฉันต้องการลงคะแนนอย่าใส่อะไรใน lib! ใส่รหัสของคุณ (รวมถึงโมดูลเพิ่มเติม) ในapp/modelsกรณีที่รหัสต้องการเข้าถึงรุ่นอื่น ๆ หากรหัสของคุณเป็น 'ไลบรารี' อย่างแท้จริงและสามารถมีอยู่ได้ด้วยตัวเองฉัน แนะนำให้ขายอัญมณีดูตัวอย่างได้ที่github.com/shageman/the_next_big_thing
Stephan

3

A> 1. คุณสามารถใช้ไวยากรณ์เดียวกันกับคลาสทับทิมอื่น ๆ ตัวอย่างเช่นฉันกำลังกำหนดโมดูล VehicleClassifer ซึ่งจะใช้เมธอด classify_vehicle เพื่อจำแนกยานพาหนะตามจำนวนล้อที่ได้รับเป็นอินพุต

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

A> 2. โดยปกติโมดูลจะถูกเก็บไว้ในโฟลเดอร์ / lib

คำถาม 3,4,5 มีคำตอบเหมือนกันมากหรือน้อย คุณสามารถใช้ได้

class SomeController < ApplicationController
  include VehicleClassfier

  def index 
    classify_vehicle(4)  
  end
end

ในชั้นเรียนคุณกำลังใช้โมดูลและคุณจะสามารถเข้าถึงวิธีการทั้งหมดของโมดูลได้

นอกจากนี้ในกรณีที่คุณจำเป็นต้องใช้โมดูลผ่านแอปของคุณคุณสามารถรวมไว้ในตัวควบคุมแอปพลิเคชันของคุณ


2
ฉันลองสิ่งนี้และได้รับข้อผิดพลาดของวิธีการที่ไม่ได้กำหนด มีความคิดว่าฉันทำอะไรผิดหรือเปล่า?
Tony

แน่ใจหรือว่าโมดูลของคุณสามารถเข้าถึงได้ stackoverflow.com/questions/6604272/…อาจช่วยคุณได้?
Shreyas

1
@Tony - คุณอาจต้องรีสตาร์ทเซิร์ฟเวอร์ของคุณแม้จะอยู่ในโหมด dev เพื่อให้สามารถใช้งานวิธีการของโมดูลได้ และทุกครั้งที่คุณเปลี่ยนรหัสในโมดูลของคุณคุณต้องรีสตาร์ทเซิร์ฟเวอร์อีกครั้ง ตัวอย่างเช่นหากเกิดข้อผิดพลาดหรือเกิดข้อผิดพลาดกับรหัสเก่า แต่เน้นรหัสใหม่ในบรรทัดนั้นในข้อความแสดงข้อผิดพลาดซึ่งทำให้สับสนมาก
โจเซฟเค

ความคิดใด ๆ วิธีการรวมและการใช้งานโมดูลที่กำหนดเองภายในเหล่านั้นApplicationHelper?
WM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.