Rails: จะรับชื่อคลาสโมเดลตามชื่อคลาสคอนโทรลเลอร์ได้อย่างไร


คำตอบ:


190

สิ่งนี้จะทำ:

class HouseBuyersController < ApplicationController

  def index
    @model_name = controller_name.classify
  end

end

สิ่งนี้มักจำเป็นเมื่อทำการแยกการกระทำของคอนโทรลเลอร์:

class HouseBuyersController < ApplicationController

  def index
    # Equivalent of @house_buyers = HouseBuyer.find(:all)
    objects = controller_name.classify.constantize.find(:all)
    instance_variable_set("@#{controller_name}", objects)
  end

end

@model_name = controller_name.classify # ส่งคืน "HouseBuyers" ขอบคุณ!
Peter Ehrlich

1
ActiveSupport :: Inflector ยอดเยี่ยม
Jared Beck

ขึ้นอยู่กับความต้องการของคุณ (คำถามนี้ไม่ได้ระบุรายละเอียดใด ๆ ) คุณสามารถcontroller_name.sub('_', ' ').titleizeขอรับ "ผู้ซื้อบ้าน" ได้
user664833

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

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

40

หากคอนโทรลเลอร์และโมเดลของคุณอยู่ในเนมสเปซเดียวกันสิ่งที่คุณต้องการคือ

controller_path.classify

controller_pathให้เนมสเปซแก่คุณ controller_nameไม่

ตัวอย่างเช่นหากคอนโทรลเลอร์ของคุณคือ

Admin::RolesController

แล้ว:

controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role"        # INCORRECT

6

เป็นการแฮ็คเล็กน้อย แต่ถ้าโมเดลของคุณตั้งชื่อตามชื่อคอนโทรลเลอร์ของคุณ:

class HouseBuyersController < ApplicationController
  def my_method
    @model_name = self.class.name.sub("Controller", "").singularize
  end
end

... จะให้ "HouseBuyer" ในตัวแปรอินสแตนซ์ @model_name ของคุณ

อีกครั้งสิ่งนี้ทำให้เกิดข้อสันนิษฐานอย่างมากว่า "HouseBuyersController" เกี่ยวข้องกับโมเดล "HouseBuyer" เท่านั้น



0

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

ตัวอย่างเช่นคุณอาจมีโมเดลชื่อโพสต์ ซึ่งสามารถมีตัวควบคุม posts_controller หรืออาจมีตัวควบคุมเช่น article_controller Rails จะรู้เกี่ยวกับโมเดลเมื่อคุณกำหนดโค้ดจริงในคอนโทรลเลอร์เช่น

def index
  @posts = Post.all
  @posts = Article.all
end  

ในตัวควบคุมมาตรฐานรางไม่มีทางที่จะทราบได้ว่าเป็นรุ่นอะไร


0

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

def controllers_model
  (self.class.name.split('::')[0..-2] << controller_name.classify).join('::')
end
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.