class HouseBuyersController < ...
def my_method
# How could I get here the relevant model name, i.e. "HouseBuyer" ?
end
end
class HouseBuyersController < ...
def my_method
# How could I get here the relevant model name, i.e. "HouseBuyer" ?
end
end
คำตอบ:
สิ่งนี้จะทำ:
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
controller_name.sub('_', ' ').titleize
ขอรับ "ผู้ซื้อบ้าน" ได้
new.controller_name.classify.constantize
ในนิยามคลาส
หากคอนโทรลเลอร์และโมเดลของคุณอยู่ในเนมสเปซเดียวกันสิ่งที่คุณต้องการคือ
controller_path.classify
controller_path
ให้เนมสเปซแก่คุณ controller_name
ไม่
ตัวอย่างเช่นหากคอนโทรลเลอร์ของคุณคือ
Admin::RolesController
แล้ว:
controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role" # INCORRECT
เป็นการแฮ็คเล็กน้อย แต่ถ้าโมเดลของคุณตั้งชื่อตามชื่อคอนโทรลเลอร์ของคุณ:
class HouseBuyersController < ApplicationController
def my_method
@model_name = self.class.name.sub("Controller", "").singularize
end
end
... จะให้ "HouseBuyer" ในตัวแปรอินสแตนซ์ @model_name ของคุณ
อีกครั้งสิ่งนี้ทำให้เกิดข้อสันนิษฐานอย่างมากว่า "HouseBuyersController" เกี่ยวข้องกับโมเดล "HouseBuyer" เท่านั้น
สำหรับเนมสเปซที่ใช้งานได้:
def resource_class
controller_path.classify.constantize
end
ไม่สามารถทำได้หากคุณใช้ MVC เริ่มต้นซึ่งดูเหมือนว่าโค้ดของคุณจะไม่เป็นไปตาม คอนโทรลเลอร์ของคุณดูเหมือนจะเป็นโมเดล แต่บางทีคุณอาจจะมีประเภทอยู่ที่นั่น อย่างไรก็ตามคอนโทรลเลอร์และโมเดลจะถูกแยกออกจากกันโดยพื้นฐานแล้วใน Rails MVC ดังนั้นคอนโทรลเลอร์จึงไม่สามารถรู้ได้ว่าพวกเขาเกี่ยวข้องกับโมเดลใด
ตัวอย่างเช่นคุณอาจมีโมเดลชื่อโพสต์ ซึ่งสามารถมีตัวควบคุม posts_controller หรืออาจมีตัวควบคุมเช่น article_controller Rails จะรู้เกี่ยวกับโมเดลเมื่อคุณกำหนดโค้ดจริงในคอนโทรลเลอร์เช่น
def index
@posts = Post.all
@posts = Article.all
end
ในตัวควบคุมมาตรฐานรางไม่มีทางที่จะทราบได้ว่าเป็นรุ่นอะไร
โซลูชันที่ยอมรับใช้ไม่ได้สำหรับฉันเนื่องจากตัวควบคุมและโมเดลของฉันถูกเนมสเปซ แต่ฉันคิดวิธีต่อไปนี้:
def controllers_model
(self.class.name.split('::')[0..-2] << controller_name.classify).join('::')
end