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
Odpowiedzi:
To zrobi to:
class HouseBuyersController < ApplicationController
def index
@model_name = controller_name.classify
end
end
Jest to często potrzebne podczas wyodrębniania akcji kontrolera:
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
aby uzyskać „Kupujący dom”.
new.controller_name.classify.constantize
w definicji klasy.
Jeśli kontroler i model znajdują się w tej samej przestrzeni nazw, to chcesz
controller_path.classify
controller_path
daje przestrzeń nazw; controller_name
nie.
Na przykład, jeśli twój kontroler to
Admin::RolesController
następnie:
controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role" # INCORRECT
To trochę hack, ale jeśli twój model nosi nazwę po nazwie kontrolera, to:
class HouseBuyersController < ApplicationController
def my_method
@model_name = self.class.name.sub("Controller", "").singularize
end
end
... da ci „HouseBuyer” w zmiennej instancji @model_name.
Ponownie, zakłada się, że „HouseBuyersController” obsługuje tylko modele „HouseBuyer”.
Nie jest to możliwe, jeśli używasz domyślnego MVC, którego kod nie wydaje się przestrzegać. Twój kontroler wydaje się być modelem, ale może po prostu masz tam typ. W każdym razie kontrolery i modele są zasadniczo oddzielone w Rails MVC, więc kontrolery nie mogą wiedzieć, z którym modelem są skojarzone.
Na przykład możesz mieć model o nazwie post. Może to mieć kontroler post_controller lub może mieć kontroler taki jak artykuły_controller. Railsy wiedzą o modelach tylko wtedy, gdy zdefiniujesz rzeczywisty kod w kontrolerze, taki jak
def index
@posts = Post.all
@posts = Article.all
end
W standardowych kontrolerach szynowych nie ma sposobu, aby dowiedzieć się, jaki jest model.