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
Antworten:
Dies wird es tun:
class HouseBuyersController < ApplicationController
def index
@model_name = controller_name.classify
end
end
Dies wird häufig benötigt, wenn Controller-Aktionen abstrahiert werden:
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
"Hauskäufer" finden.
new.controller_name.classify.constantize
in der Klassendefinition verwenden.
Wenn sich Ihr Controller und Ihr Modell im selben Namespace befinden, möchten Sie Folgendes
controller_path.classify
controller_path
gibt Ihnen den Namespace; controller_name
nicht.
Zum Beispiel, wenn Ihr Controller ist
Admin::RolesController
dann:
controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role" # INCORRECT
Es ist ein bisschen wie ein Hack, aber wenn Ihr Modell nach Ihrem Controllernamen benannt ist, dann:
class HouseBuyersController < ApplicationController
def my_method
@model_name = self.class.name.sub("Controller", "").singularize
end
end
... würde Ihnen "HouseBuyer" in Ihrer Instanzvariablen @model_name geben.
Dies setzt wiederum eine große Annahme voraus, dass "HouseBuyersController" nur "HouseBuyer" -Modelle behandelt.
Dies ist nicht möglich, wenn Sie die Standard-MVC verwenden, der Ihr Code nicht zu folgen scheint. Ihr Controller scheint ein Modell zu sein, aber vielleicht haben Sie dort gerade einen Typ. Auf jeden Fall sind Controller und Modelle in Rails MVC grundsätzlich getrennt, sodass Controller nicht wissen können, welchem Modell sie zugeordnet sind.
Zum Beispiel könnten Sie ein Modell namens post haben. Dies kann einen Controller posts_controller oder einen Controller wie articles_controller haben. Rails kennt Modelle nur, wenn Sie den tatsächlichen Code in der Steuerung wie z
def index
@posts = Post.all
@posts = Article.all
end
In Schienen-Standardsteuerungen gibt es keine Möglichkeit, das Modell zu kennen.