edge
เพิ่มเติมที่ rubyonrails.org: เพิ่มเติมเกี่ยวกับ Ruby on Rails

เทมเพลตแอปพลิเคชัน Rails

เทมเพลตแอปพลิเคชันคือไฟล์ Ruby ที่มี DSL สำหรับเพิ่ม gem, initializer, เป็นต้น ในโปรเจค Rails ที่คุณสร้างใหม่หรือโปรเจค Rails ที่มีอยู่แล้ว

หลังจากอ่านเอกสารนี้คุณจะรู้:

1 การใช้งาน

ในการใช้เทมเพลตคุณต้องให้ Rails generator รู้ว่าคุณต้องการใช้เทมเพลตไหน โดยใช้ตัวเลือก -m ซึ่งสามารถเป็นที่อยู่ของไฟล์หรือ URL

$ rails new blog -m ~/template.rb
$ rails new blog -m http://example.com/template.rb

คุณสามารถใช้คำสั่ง app:template ของ Rails เพื่อใช้เทมเพลตกับแอปพลิเคชัน Rails ที่มีอยู่แล้ว โดยให้ระบุที่อยู่ของเทมเพลตผ่านตัวแปรสภาพแวดล้อม LOCATION อีกครั้ง ซึ่งก็สามารถเป็นที่อยู่ของไฟล์หรือ URL

$ bin/rails app:template LOCATION=~/template.rb
$ bin/rails app:template LOCATION=http://example.com/template.rb

2 API เทมเพลต

API เทมเพลตของ Rails เป็น API ที่ง่ายต่อการเข้าใจ ต่อไปนี้คือตัวอย่างของเทมเพลต Rails ที่มีลักษณะทั่วไป:

# template.rb
generate(:scaffold, "person name:string")
route "root to: 'people#index'"
rails_command("db:migrate")

after_bundle do
  git :init
  git add: "."
  git commit: %Q{ -m 'Initial commit' }
end

ส่วนต่อไปนี้อธิบายเมธอดหลักที่ API นี้มี:

2.1 gem(*args)

เพิ่ม gem entry สำหรับ gem ที่ระบุลงใน Gemfile ของแอปพลิเคชันที่สร้างขึ้น

ตัวอย่างเช่น ถ้าแอปพลิเคชันของคุณขึ้นอยู่กับ gem bj และ nokogiri:

gem "bj"
gem "nokogiri"

โปรดทราบว่าเมธอดนี้เพียงแค่เพิ่ม gem ลงใน Gemfile เท่านั้น ไม่ได้ติดตั้ง gem

2.2 gem_group(*names, &block)

ห่อหุ้ม gem entries ภายในกลุ่ม

ตัวอย่างเช่น ถ้าคุณต้องการโหลด rspec-rails เฉพาะในกลุ่ม development และ test:

gem_group :development, :test do
  gem "rspec-rails"
end

2.3 add_source(source, options={}, &block)

เพิ่ม source ที่ระบุใน Gemfile ของแอปพลิเคชันที่สร้างขึ้น

ตัวอย่างเช่น ถ้าคุณต้องการใช้ source gem จาก "http://gems.github.com":

add_source "http://gems.github.com"

หากมี block แล้ว gem entries ใน block จะถูกห่อหุ้มด้วยกลุ่ม source

add_source "http://gems.github.com/" do
  gem "rspec-rails"
end

2.4 environment/application(data=nil, options={}, &block)

เพิ่มบรรทัดในคลาส Application ใน config/application.rb

หากระบุ options[:env] บรรทัดจะถูกเพิ่มในไฟล์ที่เกี่ยวข้องใน config/environments

environment 'config.action_mailer.default_url_options = {host: "http://yourwebsite.example.com"}', env: 'production'

สามารถใช้ block แทน data argument ได้

2.5 vendor/lib/file/initializer(filename, data = nil, &block)

เพิ่ม initializer ลงในไดเรกทอรี config/initializers ของแอปพลิเคชันที่สร้างขึ้น

เช่น ถ้าคุณชอบใช้ Object#not_nil? และ Object#not_blank?:

initializer 'bloatlol.rb', <<-CODE
  class Object
    def not_nil?
      !nil?
    end

    def not_blank?
      !blank?
    end
  end
CODE

อย่างเดียวกัน lib() สร้างไฟล์ในไดเรกทอรี lib/ และ vendor() สร้างไฟล์ในไดเรกทอรี vendor/

ยังมี file() ที่รับพารามิเตอร์เป็นเส้นทางสัมพันธ์จาก Rails.root และสร้างไดเรกทอรี/ไฟล์ที่จำเป็น:

file 'app/components/foo.rb', <<-CODE
  class Foo
  end
CODE

จะสร้างไดเรกทอรี app/components และใส่ foo.rb ลงไปในนั้น

2.6 rakefile(filename, data = nil, &block)

สร้างไฟล์ rake ใหม่ใน lib/tasks พร้อมกับงานที่ระบุ:

rakefile("bootstrap.rake") do
  <<-TASK
    namespace :boot do
      task :strap do
        puts "i like boots!"
      end
    end
  TASK
end

ตัวอย่างข้างต้นสร้าง lib/tasks/bootstrap.rake พร้อมกับงาน rake boot:strap

2.7 generate(what, *args)

เรียกใช้ generator ของ Rails พร้อมกับอาร์กิวเมนต์ที่กำหนด

generate(:scaffold, "person", "name:string", "address:text", "age:number")

2.8 run(command)

เรียกใช้คำสั่งอื่น ๆ คล้ายกับเครื่องหมาย backticks ตัวอย่างเช่น ถ้าคุณต้องการลบไฟล์ README.rdoc:

run "rm README.rdoc"

2.9 rails_command(command, options = {})

เรียกใช้คำสั่งในแอปพลิเคชัน Rails ตัวอย่างเช่น ถ้าคุณต้องการ migrate ฐานข้อมูล:

rails_command "db:migrate"

คุณยังสามารถรันคำสั่งใน environment ของ Rails ที่แตกต่างกันได้

rails_command "db:migrate", env: 'production'

คุณยังสามารถรันคำสั่งในฐานะ super-user ได้

rails_command "log:clear", sudo: true

คุณยังสามารถรันคำสั่งที่ควรยกเลิกการสร้างแอปพลิเคชันหากไม่สำเร็จได้

rails_command "db:migrate", abort_on_failure: true

2.10 route(routing_code)

เพิ่มรายการเส้นทางในไฟล์ config/routes.rb ในขั้นตอนก่อนหน้า เราสร้าง scaffold ของ person และลบ README.rdoc ออกแล้ว ตอนนี้เราจะทำให้ PeopleController#index เป็นหน้าเริ่มต้นของแอปพลิเคชัน:

route "root to: 'person#index'"

2.11 inside(dir)

ช่วยให้คุณรันคำสั่งจากไดเรกทอรีที่กำหนด ตัวอย่างเช่น ถ้าคุณมี Rails รุ่นล่าสุดที่คุณต้องการทำ symbolic link จากแอปพลิเคชันใหม่ของคุณ คุณสามารถทำดังนี้: ruby inside('vendor') do run "ln -s ~/commit-rails/rails rails" end

2.12 ask(question)

ask() ให้คุณมีโอกาสได้รับคำตอบจากผู้ใช้และนำมาใช้ในเทมเพลตของคุณ สมมติว่าคุณต้องการให้ผู้ใช้ตั้งชื่อไลบรารีใหม่ที่คุณกำลังเพิ่ม:

lib_name = ask("คุณต้องการตั้งชื่อไลบรารีที่สว่างไสว?")
lib_name << ".rb" unless lib_name.index(".rb")

lib lib_name, <<-CODE
  class Shiny
  end
CODE

2.13 yes?(question) หรือ no?(question)

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

rails_command("db:migrate") if yes?("เรียกใช้การโยกย้ายฐานข้อมูล?")
# no?(question) ทำงานที่ตรงข้ามกัน

2.14 git(:command)

เทมเพลต Rails ช่วยให้คุณสามารถเรียกใช้คำสั่ง git ใดๆ:

git :init
git add: "."
git commit: "-a -m 'Initial commit'"

2.15 after_bundle(&block)

ลงทะเบียน callback เพื่อทำงานหลังจากที่ได้รวบรวมและสร้าง binstubs แล้ว มีประโยชน์ในการเพิ่มไฟล์ที่สร้างขึ้นในการควบคุมเวอร์ชัน:

after_bundle do
  git :init
  git add: '.'
  git commit: "-a -m 'Initial commit'"
end

Callback จะถูกเรียกใช้งานแม้ --skip-bundle จะถูกส่งผ่านไป

3 การใช้งานขั้นสูง

เทมเพลตแอปพลิเคชันถูกประเมินในบริบทของ Rails::Generators::AppGenerator instance มันใช้ apply การดำเนินการที่ Thor ให้

นี่หมายความว่าคุณสามารถขยายและเปลี่ยนแปลงตัวอย่างเพื่อตรงกับความต้องการของคุณ

ตัวอย่างเช่น โดยการเขียนทับเมธอด source_paths เพื่อระบุตำแหน่งของเทมเพลตของคุณ ตอนนี้เมธอดเช่น copy_file จะยอมรับ เส้นทางสัมพันธ์กับตำแหน่งของเทมเพลตของคุณ

def source_paths
  [__dir__]
end

ข้อเสนอแนะ

คุณสามารถช่วยปรับปรุงคุณภาพของคู่มือนี้ได้

กรุณาช่วยเพิ่มเติมหากพบข้อผิดพลาดหรือข้อผิดพลาดทางความจริง เพื่อเริ่มต้นคุณสามารถอ่านส่วน การสนับสนุนเอกสาร ของเราได้

คุณอาจพบเนื้อหาที่ไม่สมบูรณ์หรือเนื้อหาที่ไม่ได้อัปเดต กรุณาเพิ่มเอกสารที่ขาดหายไปสำหรับเนื้อหาหลัก โปรดตรวจสอบ Edge Guides ก่อนเพื่อตรวจสอบ ว่าปัญหาได้รับการแก้ไขหรือไม่ในสาขาหลัก ตรวจสอบ คู่มือแนวทาง Ruby on Rails เพื่อดูรูปแบบและกฎเกณฑ์

หากคุณพบข้อผิดพลาดแต่ไม่สามารถแก้ไขได้เอง กรุณา เปิดปัญหา.

และสุดท้าย การสนทนาใด ๆ เกี่ยวกับ Ruby on Rails เอกสารยินดีต้อนรับที่สุดใน เว็บบอร์ดอย่างเป็นทางการของ Ruby on Rails.