ตัวควบคุมเอกพจน์หรือพหูพจน์และชื่อตัวช่วยใน Rails


112

การใช้ชื่อเอกพจน์สำหรับคอนโทรลเลอร์และตัวช่วยมีข้อเสียหรือไม่? ดูเหมือนไม่มีอะไรต้องพึ่งพาสิ่งนี้ ดูเหมือนว่าผู้ช่วยเหลือไม่จำเป็นต้องเลือกเอกพจน์เทียบกับพหูพจน์เหมือนตัวควบคุมที่เกี่ยวข้องอย่างน้อยก็เป็นไปตามการทดลองที่ จำกัด ของฉัน เป็นเช่นนั้นจริงหรือ?


2
ฉันเคยมีภาวะที่กลืนไม่เข้าคายไม่ออกเหมือนกันที่พยายามตัดสินใจเลือกชื่อตัวควบคุมเอกพจน์หรือพหูพจน์!
Andrew

15
ขอบคุณ :) วัฒนธรรม Rails มีวิธีที่จะทำให้คุณรู้สึกโง่หากคุณตั้งคำถามแบบนี้
allyourcode

คำตอบ:


158

แน่นอนพหูพจน์

ด้วยการกำหนดเส้นทางที่เงียบสงบและตัวควบคุมเอกพจน์

ควบคุม:

dog_controller.rb  

เส้นทาง:

map.resources :dogs  # => blows up  
map.resources :dog  # is ok, but...  
dogs_path # => blows up  
dog_path  # => ok  

การใช้ตัวควบคุมพหูพจน์

ควบคุม:

dogs_controller.rb

เส้นทาง:

map.resources :dogs  
dogs_path # => ok  
dog_path # => ok  

rails generate controller --help มีตัวอย่างพหูพจน์:

Example:
`rails generate controller CreditCards open debit credit close`

CreditCards controller with URLs like /credit_cards/debit.
    Controller: app/controllers/credit_cards_controller.rb
    Test:       test/controllers/credit_cards_controller_test.rb
    Views:      app/views/credit_cards/debit.html.erb [...]
    Helper:     app/helpers/credit_cards_helper.rb

23
ตกลง เป็นเรื่องที่น่าสับสนที่ข้อความช่วยเหลือของตัวสร้าง Rails 3.1 สำหรับคอนโทรลเลอร์ใช้ "CreditCard" (เอกพจน์) เป็นตัวอย่าง
bantic

4
Rails ช่วยตอนนี้ใช้พหูพจน์: rail สร้างคอนโทรลเลอร์ CreditCards เปิดเดบิตเครดิตปิด
notapatch

3
ยังคงมี CreditCard เอกพจน์ที่นี่: guide.rubyonrails.org/command_line.html#rails-generate
rcrogers

เราจะเขียนโลแคลสำหรับคอนโทรลเลอร์เอกพจน์ได้อย่างไร stackoverflow.com/questions/29650094/…
santosh

ดังนั้นการตั้งชื่อควรเป็นพหูพจน์และมาตามตัวพิมพ์ เช่น: รางสร้างตัวควบคุมดัชนีใหม่สุนัขสร้างลบทำลายแก้ไข "??
BKSpurgeon

27

การใช้ชื่อพหูพจน์สำหรับคอนโทรลเลอร์เป็นเพียงแบบแผน

ชื่อพหูพจน์มักจะฟังดูเป็นธรรมชาติกว่า (โดยเฉพาะอย่างยิ่งสำหรับคอนโทรลเลอร์ที่เชื่อมโยงโดยตรงกับโมเดลเฉพาะ: ผู้ใช้ -> ผู้ใช้ ฯลฯ ) แต่คุณสามารถใช้อะไรก็ได้ที่คุณต้องการ

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


10
มันจะเป็นธรรมชาติกว่านี้ไหมสำหรับคอนโทรลเลอร์ที่ตรงกับ User เป็น UserController ?? นอกจากนี้หากคุณใช้เส้นทางเริ่มต้นคุณจะได้รับ url ที่ดูเหมือน / users / edit ซึ่งดูเหมือนว่าคุณกำลังแก้ไขผู้ใช้ทั้งหมด สำหรับฉันมันไม่เป็นธรรมชาติเลย
allyourcode

5
@allyourcode: ฉันเดาว่ามันเป็นเรื่องส่วนตัวทั้งหมด สำหรับฉันการมี / ผู้ใช้แสดงรายการผู้ใช้ทั้งหมดนั้นเป็นธรรมชาติมากกว่า / ผู้ใช้
Can Berk Güder

1
โอ้และมันเป็นวิธีที่สงบ
Can Berk Güder

3
@ "วิธีที่สงบ" สามารถฟังดูเหมือนบทสวดทางศาสนา นั่นไม่ทำให้ฉันแปลกใจจริงๆเนื่องจาก Rails ค่อนข้างเคร่งศาสนา ฉันชอบวิธีที่ Rails หมกมุ่นอยู่กับ REST แต่เส้นทางเริ่มต้นก็ไม่ได้นิ่งนอนใจ แม้แต่การกำหนดค่าเส้นทาง RESTful ก็ผิดปกติ รวมถึง: condition => {: method =>: post} ในอาร์กิวเมนต์ที่สองเพื่อเชื่อมต่อนั้นไม่สมเหตุสมผลเนื่องจากแฮชควรจะระบุวิธีจัดการกับคำขอใด ๆ ที่ตรงกับกฎปัจจุบันไม่ใช่ว่าคำขอใดก็ตามที่ตรงกับกฎปัจจุบัน .
allyourcode

2
@allyourcode ตามนี้เส้นทางเริ่มต้นสำหรับการแก้ไขคือ / users /: id / edit แทน / users / edit การพูดว่า "จากผู้ใช้ทั้งหมดแก้ไขผู้ใช้ด้วย id: id" ฟังดูเป็นธรรมชาติอย่างยิ่งสำหรับฉัน
DavidG

19

Model เป็นเอกพจน์เนื่องจากอ้างอิงวัตถุเดียวเช่น User คอนโทรลเลอร์เป็นพหูพจน์เนื่องจากเป็นตัวควบคุม (วิธีการ) สำหรับการรวบรวมผู้ใช้ วิธีการตั้งชื่อเส้นทางนั้นขึ้นอยู่กับนักพัฒนาแต่ละคน ฉันไม่เคยมีผู้ใช้บ่นว่า URL สำหรับคำขอเว็บเป็นเอกพจน์หรือพหูพจน์ ผลลัพธ์สุดท้ายในการรักษาแบบแผนทั่วไปสำหรับผู้ร่วมให้ข้อมูลในปัจจุบันและอนาคตในขณะที่ให้บริการการแสดงเพจคุณภาพหรือคำขอ API สำหรับผู้ใช้ปลายทาง


12

คุณมีคำอธิบายที่สมบูรณ์มากในคู่มือ Rails: http://edgeguides.rubyonrails.org/routing.html#resource-routing-the-rails-default


4
จริงๆแล้วนี่เป็นคำตอบที่ถูกต้อง b / c ถ้าคุณอ่านมันอธิบายว่าพหูพจน์เป็นคำตอบที่ถูกต้องสำหรับกลุ่มทรัพยากร สำหรับทรัพยากรเดี่ยวเอกพจน์คือคำตอบที่ถูกต้อง ตัวอย่างในเอกสารประกอบ และจริงๆแล้วนี่เป็นคำตอบที่ดีในโพสต์อื่น ๆ นี้: stackoverflow.com/questions/2614858/…
Rob

คำตอบที่ได้รับการสนับสนุนจากการอ้างอิงอย่างเป็นทางการเช่นในโพสต์นี้ช่วยมือใหม่ได้มาก! ขอบคุณ
Wasif Hossain

9

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

แอปพลิเคชั่น Rails ที่ฉันกำลังทำงานอยู่นั้นเข้ากับหมวดหมู่นี้และมันเป็นเพียงการสร้างความรำคาญให้กับฉันที่ Rails คาดว่าตัวระบุที่ฉันกำหนดเป็นเอกพจน์ในที่เดียวจะถูกใช้ในรูปพหูพจน์ในที่อื่น ๆ ตัวอย่างเช่นฉันอาจต้องการกำหนดสิ่งนี้ในconfig/routes.rb:

  resource :dashboard, :only => [:show]

จากนั้นฉันต้องการให้คอนโทรลเลอร์DashboardControllerแสดงข้อมูลสรุปเกี่ยวกับลักษณะบางอย่างของแอปพลิเคชันโดยรวบรวมข้อมูลจากตารางฐานข้อมูลมากกว่าหนึ่งตาราง ดังนั้นที่นี่Dashboardไม่ได้หมายถึงรูปแบบของแอพลิเคชันใด ๆ และมันจะแปลก ๆ DashboardsControllerเพียงแค่มีการควบคุมที่เป็นชื่อ

ฉันพบวิธีแก้ปัญหาที่ดีสำหรับการระคายเคืองของพหูพจน์อัตโนมัติในคำตอบนี้ ในระยะสั้นแก้ไขไฟล์config/initializers/inflections.rbและเพิ่มคำที่คุณไม่ต้องการให้เป็นพหูพจน์โดยอัตโนมัติในคำจำกัดความนี้:

ActiveSupport::Inflector.inflections do |inflect|
  inflect.uncountable %w( dashboard foo bar baz )
end

3

หลักการตั้งชื่อของคอนโทรลเลอร์ในRails สนับสนุนการทำให้เป็นพหูพจน์ของคำสุดท้ายในชื่อของคอนโทรลเลอร์แม้ว่าจะไม่จำเป็นอย่างเคร่งครัดก็ตาม (เช่นApplicationController)

ยกตัวอย่างเช่นClientsControllerเป็นที่นิยมClientController, SiteAdminsControllerเป็นที่นิยมSiteAdminControlleR หรือSitesAdminsControllerและอื่น ๆ

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

อ้างถึงเอกสารอนุสัญญาการตั้งชื่อคอนโทรลเลอร์ - ราง



2

ถ้าคอนโทรลเลอร์เป็นทรัพยากรก็ต้องเป็นพหูพจน์ ...

ตัวอย่างเช่น

ตัวควบคุม

articles_controller.rb

แบบ

article.rb

แต่คุณสามารถใช้ชื่อคอนโทรลเลอร์เอกพจน์ได้เมื่อคุณไม่มีรุ่นที่เกี่ยวข้องเช่น

welcome_controller.rb

1

การใช้พหูพจน์จะฟังดูดีกว่าและถ้าคุณมีคอนโทรลเลอร์ที่จัดการการตอบสนองเอกพจน์เช่นผู้ใช้คุณก็ยังสามารถตั้งชื่อ url / user ได้

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


ความคิดเห็นเช่นเดียวกับ Can Berk Guder นอกจากนี้ฉันมีปัญหาในการติดตามประโยค / ย่อหน้าสุดท้ายของคุณเพราะมีเครื่องหมายวรรคตอนน้อยมาก!
allyourcode

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