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
Respostas:
Isso vai resolver:
class HouseBuyersController < ApplicationController
def index
@model_name = controller_name.classify
end
end
Isso geralmente é necessário ao abstrair ações do controlador:
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
para obter "compradores de casa".
new.controller_name.classify.constantize
na definição da classe.
Se o seu controlador e modelo estão no mesmo namespace, então o que você quer é
controller_path.classify
controller_path
fornece o namespace; controller_name
não.
Por exemplo, se o seu controlador é
Admin::RolesController
então:
controller_path.classify # "Admin::Role" # CORRECT
controller_name.classify # "Role" # INCORRECT
É um pouco hackeado, mas se o nome do seu modelo for o nome do controlador:
class HouseBuyersController < ApplicationController
def my_method
@model_name = self.class.name.sub("Controller", "").singularize
end
end
... daria a você "HouseBuyer" em sua variável de instância @model_name.
Novamente, isso faz uma grande suposição de que "HouseBuyersController" só lida com modelos "HouseBuyer".
Isso não é possível se você estiver usando o MVC padrão, que seu código parece não seguir. Seu controlador parece ser um modelo, mas talvez você só tenha um tipo aí. De qualquer forma, controladores e modelos são fundamentalmente separados no Rails MVC, então os controladores não podem saber a qual modelo estão associados.
Por exemplo, você pode ter um modelo chamado post. Isso pode ter um controlador posts_controller ou pode ter um controlador como o articles_controller. O Rails só conhece os modelos quando você define o código real no controlador, como
def index
@posts = Post.all
@posts = Article.all
end
Em controladores padrão rails não há como saber qual é o modelo.