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
Jawaban:
Ini akan melakukannya:
class HouseBuyersController < ApplicationController
def index
@model_name = controller_name.classify
end
end
Ini sering diperlukan saat mengabstraksi tindakan pengontrol:
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
untuk mendapatkan "Pembeli Rumah".
new.controller_name.classify.constantize
definisi kelas.
Jika pengontrol dan model Anda berada di namespace yang sama, maka yang Anda inginkan adalah
controller_path.classify
controller_path
memberi Anda namespace; controller_name
tidak.
Misalnya, jika pengontrol Anda adalah
Admin::RolesController
kemudian:
controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role" # INCORRECT
Ini sedikit hack, tetapi jika model Anda dinamai sesuai nama pengontrol Anda, maka:
class HouseBuyersController < ApplicationController
def my_method
@model_name = self.class.name.sub("Controller", "").singularize
end
end
... akan memberi Anda "HouseBuyer" dalam variabel instance @model_name Anda.
Sekali lagi, ini membuat asumsi besar bahwa "HouseBuyersController" hanya berurusan dengan model "HouseBuyer".
Ini tidak mungkin jika Anda menggunakan MVC default, yang tampaknya tidak diikuti oleh kode Anda. Pengontrol Anda sepertinya model tetapi mungkin Anda baru saja mendapatkan tipe di sana. Bagaimanapun, pengontrol dan model pada dasarnya dipisahkan di Rails MVC sehingga pengontrol tidak dapat mengetahui model mana yang dikaitkan dengannya.
Misalnya Anda bisa memiliki model bernama post. Ini dapat memiliki pengontrol posts_controller atau dapat memiliki pengontrol seperti Articles_controller. Rails hanya tahu tentang model ketika Anda menentukan kode sebenarnya di controller seperti
def index
@posts = Post.all
@posts = Article.all
end
Dalam pengontrol standar rel, tidak ada cara untuk mengetahui modelnya.
Solusi yang diterima tidak berfungsi untuk saya karena pengontrol dan model saya diberi spasi nama. Sebagai gantinya, saya menemukan metode berikut:
def controllers_model
(self.class.name.split('::')[0..-2] << controller_name.classify).join('::')
end